Что означает массив $ # в Perl? - PullRequest
15 голосов
/ 28 октября 2008

Я смотрю на следующий фрагмент кода:

my @ret = <someMethod>
return (undef) if( $DB_ERROR );
return (undef) unless ($#ret >= 0);

Предоставляет ли $# только количество элементов в массиве?

Ответы [ 4 ]

39 голосов
/ 28 октября 2008

$#arrayname дает индекс последнего элемента, поэтому, если массив @ret имеет 2 элемента, то $#ret равно 1.

И, как заметил Барри Браун, пустой массив дает -1.

Чтобы получить длину, вы можете использовать массив в скалярном контексте:

print scalar @ret;
23 голосов
/ 28 октября 2008

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;
6 голосов
/ 28 октября 2008

Имейте в виду, что выражение массива $ # вернет -1, когда массив содержит ноль элементов.

2 голосов
/ 02 января 2010

Подводя итог всем остальным, этот код будет более разборчивым, если он будет написан так:

my @ret = someMethod();
return if $DB_ERROR;
return unless @ret;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...