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

Oleg Kostyuk cub.uanic на gmail.com
Пн Окт 3 04:20:50 PDT 2011


Вопрос был не о том, "а каким другим способом это можно проверить".
Возможно, формулировка была не однозначна, но имелось ввиду следующее:
как же вообще можно <cite>безопасно "разименовать переменную и
Получить массив или хэш", когда "не известен тип входной
структуры"?</cite> - ведь если данные по ссылке и разыменование не
совпадут по типам, то будет сгенерировано исключение.


3 октября 2011 г. 12:21 пользователь oleg alexeenkov <proler на gmail.com> написал:
> Oleg Kostyuk <cub.uanic на gmail.com> писал(а) в своём письме Sat, 01 Oct 2011
> 23:15:50 +0400:
>
> UNIVERSAL::isa($a, 'HASH')
>
>> А как же без использования ref можно безопасно "разименовать
>> переменную и Получить массив или хэш", когда "не известен тип входной
>> структуры"?
>>
>> (то что в кавычках - цитаты)
>>
>>
>> 1 октября 2011 г. 11:43 пользователь Denis Fedoseev
>> <denis.fedoseev на gmail.com> написал:
>>>
>>> Это паранойя в том плане  - что если тебе нужно разименовать переменную и
>>> Получить массив или хэш - то смысла в такой проверке нет. Если тебе нужно
>>> Проверить что ссылка это массив или хэш - то тогда надо пользоваться 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 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