[Moscow.pm] Интератор инициализирует ссылку на массив/хеш

Denis Fedoseev denis.fedoseev на gmail.com
Сб Окт 1 01:43:07 PDT 2011


Это паранойя в том плане  - что если тебе нужно разименовать переменную и Получить массив или хэш - то смысла в такой проверке нет. Если тебе нужно Проверить что ссылка это массив или хэш - то тогда надо пользоваться ref eq 'ARRAY'


On Sep 30, 2011, at 11:52 PM, Oleg Kostyuk wrote:

> Про перегрузку соглашусь, но почему использование ref eq 'ARRAY' - это
> паранойя? Это сплошь и рядом используется, например в том же
> DBIx::Class. Обоснуйте-ка, милейший!
> 
> 30 сентября 2011 г. 16:51 пользователь Анатолий Шарифулин
> <sharifulin на gmail.com> написал:
>> Вместо:
>> @$t2 = @$t3;
>> обычно пишу:
>> $t2 = [ @$t3 ];
>> 
>> Ну и: нужно быть уверенным в том, что ты разыменовываешь, если не уверен, то
>> @{ $t2 || [] };
>> Только не нужно быть пароноиком и использовать ref eq 'ARRAY' или
>> использовать перегрузку, когда не известен тип входной структуры.
>> Такая практика меня ещё ни разу не привела к подобным ошибкам.
>> 
>> 2011/9/30 Alexander Onokhov <ccnweb на gmail.com>
>>> 
>>> Да про lvalue хорошо
>>> 
>>> @$t2 = (1,2,3);  # нет ошибки
>>> 
>>> 
>>> On Fri, Sep 30, 2011 at 4:42 PM, Dmitry Karpich <meettya на gmail.com> wrote:
>>>> 
>>>> 
>>>> http://stackoverflow.com/questions/6419618/perl-vivification-question-while-dereferencing-undefined-array-reference
>>>> 
>>>> http://stackoverflow.com/questions/2206836/why-does-perl-autovivify-in-this-case
>>>> stackoverflow наш друг :)
>>>> 
>>>> On Sep 30, 2011, at 5:38 PM, Иван Бессарабов wrote:
>>>> 
>>>> Ок. А почему в списочном контексте происходит инициализация ссылки?
>>>> 
>>>> 30 сентября 2011 г. 17:32 пользователь Анатолий Шарифулин
>>>> <sharifulin на gmail.com> написал:
>>>> 
>>>> Потому что разный контекст.
>>>> 
>>>> foreach (scalar @$t1) {}
>>>> 
>>>> Вот так будет идентично ифу.
>>>> 
>>>> 
>>>> 2011/9/30 Andrew Shitov <andy на shitov.ru>
>>>> 
>>>> Потому что $t1 станет другим после foreach, а $t2 не станет :-)
>>>> 
>>>> $ perl -E'use strict; use Data::Dumper; my $t; print Dumper($t); for
>>>> 
>>>> (@$t) {}; print Dumper($t);'
>>>> 
>>>> $VAR1 = undef;
>>>> 
>>>> $VAR1 = [];
>>>> 
>>>> 
>>>> 2011/9/30 Иван Бессарабов <ivan на bessarabov.ru>:
>>>> 
>>>> Я не могу понять из-за чего происходит такое поведение.
>>>> 
>>>> Покажите, пожалуйста, кусок доки где объянено, почему так.
>>>> 
>>>> 
>>>> #!/usr/bin/perl
>>>> 
>>>> use strict;
>>>> 
>>>> use warnings;
>>>> 
>>>> use 5.010;
>>>> 
>>>> use Data::Dumper;
>>>> 
>>>> my ($t1, $t2);
>>>> 
>>>> foreach (@$t1) {} # почему-то не вызывает ошибку
>>>> 
>>>> say Dumper $t1;
>>>> 
>>>> say '' if @$t2; # вызывает ошибку, как и ожидалось
>>>> 
>>>> say 'end';
>>>> 
>>>> --
>>>> 
>>>> Moscow.pm mailing list
>>>> 
>>>> moscow-pm на pm.org | http://moscow.pm.org
>>>> 
>>>> 
>>>> 
>>>> 
>>>> --
>>>> 
>>>> Andrew Shitov
>>>> 
>>>> ______________________________________________________________________
>>>> 
>>>> andy на shitov.ru | http://shitov.ru
>>>> 
>>>> --
>>>> 
>>>> Moscow.pm mailing list
>>>> 
>>>> moscow-pm на pm.org | http://moscow.pm.org
>>>> 
>>>> 
>>>> 
>>>> --
>>>> 
>>>> С уважением,
>>>> 
>>>>  Анатолий Шарифулин.
>>>> 
>>>> --
>>>> 
>>>> Moscow.pm mailing list
>>>> 
>>>> moscow-pm на pm.org | http://moscow.pm.org
>>>> 
>>>> 
>>>> --
>>>> Moscow.pm mailing list
>>>> moscow-pm на pm.org | http://moscow.pm.org
>>>> 
>>>> 
>>>> --
>>>> Moscow.pm mailing list
>>>> moscow-pm на pm.org | http://moscow.pm.org
>>>> 
>>> 
>>> 
>>> 
>>> --
>>> Alexander
>>> 
>>> --
>>> Moscow.pm mailing list
>>> moscow-pm на pm.org | http://moscow.pm.org
>>> 
>> 
>> 
>> 
>> --
>> С уважением,
>>  Анатолий Шарифулин.
>> 
>> --
>> Moscow.pm mailing list
>> moscow-pm на pm.org | http://moscow.pm.org
>> 
>> 
> 
> 
> 
> -- 
> Sincerely yours,
> Oleg Kostyuk (CUB-UANIC)
> -- 
> Moscow.pm mailing list
> moscow-pm на pm.org | http://moscow.pm.org



Подробная информация о списке рассылки Moscow-pm