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

Oleg Kostyuk cub.uanic на gmail.com
Пт Сен 30 12:52:47 PDT 2011


Про перегрузку соглашусь, но почему использование 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