exists в @_

12 views
Skip to first unread message

Oleg Alistratov

unread,
Aug 10, 2011, 10:04:51 AM8/10/11
to kiev-perl-...@googlegroups.com, Moscow.pm group

Привет,

я, конечно, понимал, что @_ массив крайне хитрожопый,
да и не массив вообще, но сегодня оно меня выбило из колеи.

Вот код: http://ideone.com/0BeFd
там же и результат выполнения.

exists для элемента @_ не отрабатывает нормально, если @_
ассайнится не на честный список, а на последовательность параметров.

Подтверждается в перлах 8, 10, 12.

Явного описания в документации не нашел, объяснение придумать можно,
то есть за баг я такое поведение не считаю… но все равно неприятно.
Тем более, что вылилось у меня оно на уровне "не вызывается колбек
для обновления значения в кеше при протухании элемента кеша с последующим
вызовом очистки по алгоритму LRU" :) соответственно, полтора часа отладки
и матюгов.

Короче, камрады, знайте, если еще не. Я вот не знал.


--
Олег Алистратов

und3f

unread,
Aug 10, 2011, 10:11:24 AM8/10/11
to kiev-perl-...@googlegroups.com
Вырезка из perldoc -f exists

               exists may also be called on array elements, but its behavior
               is much less obvious, and is strongly tied to the use of
               "delete" on arrays.  Be aware that calling exists on array
               values is deprecated and likely to be removed in a future
               version of Perl.

Также проверка на неопределенное значение `defined $_[$i]' не тоже самое что проверка существование значения.
Для массива важно помнить что элементы в нем идут последовательно и пробелов быть не может, поэтому проверять наличие элементов стоит через количество элементов в массиве.

Oleg Alistratov

unread,
Aug 10, 2011, 10:29:02 AM8/10/11
to kiev-perl-...@googlegroups.com, und3f

On 10.08.2011 17:11, und3f wrote:
> *Be aware* that calling exists on array


> values is deprecated and likely to be removed in a future
> version of Perl.

Внесли это замечание в 5.12, и пройдет еще немало времени,
прежде чем зачистят это выражение в куче модулей.


>
> Также проверка на неопределенное значение `defined $_[$i]' не тоже
> самое что проверка существование значения.
> Для массива важно помнить что элементы в нем идут последовательно и
> пробелов быть не может, поэтому проверять наличие элементов стоит
> через количество элементов в массиве.

Спасибо, кэп. В том то и дело, что в приведенном коде элемент массива
_существует_,
он вообще в середине стоит, а exists возвращает false.

-- Олег Алистратов

Reply all
Reply to author
Forward
0 new messages