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

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


3 октября 2011 г. 14:31 пользователь Анатолий Шарифулин
<sharifulin на gmail.com> написал:
> Олег, какой Вы настырный :-)
Нет же, что вы. Просто человек неверно понял мои слова - я внёс
ясность. Никакой настырности и рядом не валялось.


> Специфицируйте входные данные и вам не придётся писать лишние проверки.
Пожалуйста, вот вам спецификация:
http://search.cpan.org/dist/DBIx-Class/lib/DBIx/Class/ResultSet.pm#find
Или ещё лучше: http://search.cpan.org/dist/DBIx-Class/lib/DBIx/Class/ResultSet.pm#order_by

Если лень ходить по ссылкам - вот нужные куски:

  find
    Arguments: \%columns_values | @pk_values, \%attrs?
    Return Value: $row_object | undef

  order_by
    Value: ( $order_by | \@order_by | \%order_by )

Я бы посмотрел, как будет делаться разыменование без проверок. И
только не надо говорить, что "спека кривая" и "так только идиоты
пишут" :) Потому что это работает, и работает классно и удобно.


> Если в сабу приходит только ссылка на массив, то не стоит писать код:
>  ref eq'ARRAY'
> Это условие всегда будет тру. Я это имел в виду.
Ну, это ж совсем другое дело. Получается, ваши слова тоже были совсем
не однозначны. С кем не бывает - имел ввиду одно, сказал другое.
Теперь всё понятно, спасибо за разъяснения.


> 2011/10/3 Oleg Kostyuk <cub.uanic на gmail.com>
>>
>> Вопрос был не о том, "а каким другим способом это можно проверить".
>> Возможно, формулировка была не однозначна, но имелось ввиду следующее:
>> как же вообще можно <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 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