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

Анатолий Шарифулин sharifulin на gmail.com
Пт Сен 30 06:51:58 PDT 2011


Вместо:

@$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/6419618/perl-vivification-question-while-dereferencing-undefined-array-reference>
>> http://stackoverflow.com/questions/2206836/why-does-perl-autovivify-in-this-case
>>
>>
>> <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
>
>


-- 
С уважением,
 Анатолий Шарифулин.
----------- следущая часть -----------
Вложение в формате HTML было извлечено…
URL: <http://mail.pm.org/pipermail/moscow-pm/attachments/20110930/d19745bf/attachment-0001.html>


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