Всем привет.
Недавно работая с || наткнулся на то, что оператор возвращает не то, что
предпологалось. Покопавшись в документации - нашел, что он работает именно так,
а не так как ожидается:
@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:[email protected]
--
Moscow.pm mailing list
[email protected] | http://moscow.pm.org