edg правильно, но оригинальный код излишне тупой. В большинстве случаев $#foo
- это красный флаг, чтобы код можно было написать проще, используя scalar @foo
.
return (undef) unless ($#ret >= 0);
unless foo >= bar
трудно разгадать. Во-первых, превратите это в позитивное утверждение.
return (undef) if ($#ret < 0);
Когда $ # ret <0? Когда это -1. $ # Ret из -1 - это массив длины 0. Таким образом, вышеприведенное можно записать гораздо проще: ... </p>
return (undef) if scalar @ret <= 0;
Но вы не можете иметь массив отрицательной длины, так что ...
return (undef) if scalar @ret == 0;
И == находится в скалярном контексте, так что «скаляр» избыточен ...
return (undef) if @ret == 0;
Но это всего лишь словесный способ сказать "если @ret
ложно".
return (undef) if !@ret;
То, что я думаю для простых модификаторов операторов, лучше выражать, если только.
return (undef) unless @ret;
Не проще ли следовать?
В качестве последнего примечания, return undef
не рекомендуется, потому что это неправильно в контексте списка. Вы получите обратно список, содержащий один элемент undef, который является истинным. Вместо этого просто используйте пустой возврат, который возвращает undef в скалярном контексте, и пустой список в контексте списка.
return unless @ret;