[SPb-pm] [Moscow.pm] Работа оператора ||
Victor Efimov
victor at vsespb.ru
Sat Nov 28 12:52:36 PST 2015
http://www.nntp.perl.org/group/perl.perl6.language/2000/08/msg1104.html
It would be nice to be able to say
@a = @b || @c
instead of having to resort to
@a = @b ? @b : @c
The reason that it is not currently possible is that C<@b> (or the list
expression in its place) has to be evaluated in scalar context to determine
whether to evaluate C<@c>, and that propagating context to C<@b> would
require reevaluating it, which might have undesirable side effects (instead
of C<@b>, it might be C<decrement_balance()>).
29 ноября 2015 г., 3:27 пользователь Eugen Konkov <kes-kes at yandex.ru> написал:
> Всем привет.
>
> Недавно работая с || наткнулся на то, что оператор возвращает не то, что предпологалось. Покопавшись в документации - нашел, что он работает именно так, а не так как ожидается:
>
> @a = @b || @c; # this is wrong
> @a = scalar(@b) || @c; # really meant this
> @a = @b ? @b : @c; # this works fine, though
>
> И мне кажется, что было бы намного лучше, если бы этот || работал наподобие:
> sub OR {
> my( $left, $right ) = @_;
>
> if( wantarray ) {
> @result = $left->(); # list
> return @result if scalar @result;
>
> return $right->();
> }
> else {
> $result = $left->(); # scalar
> return $result if $result;
>
> return $right->();
> }
> }
>
>
> @l = foo() OR bar(); # foo is called in list context
> $s = foo() OR bar(); # foo is called in scalar context
>
> т.е. если || вызыван в списковом контексте, то левый операнд вычислять в списковом и возвращать список,
> если || вызван в скалярном - соответственно левый операнд вычислять тоже в скалярном и возвращать скаляр.
>
> Что скажете: "жить" будет легче или нет?
>
> --
> Eugen mailto:kes-kes at yandex.ru
>
> --
> Moscow.pm mailing list
> moscow-pm at pm.org | http://moscow.pm.org
More information about the Spb-pm
mailing list