[SPb-pm] Работа оператора ||
Eugen Konkov
kes-kes at yandex.ru
Sat Nov 28 16:27:49 PST 2015
Всем привет.
Недавно работая с || наткнулся на то, что оператор возвращает не то, что предпологалось. Покопавшись в документации - нашел, что он работает именно так, а не так как ожидается:
@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
More information about the Spb-pm
mailing list