Всем привет.

Недавно работая с || наткнулся на то, что оператор возвращает не то, что 
предпологалось. Покопавшись в документации - нашел, что он работает именно так, 
а не так как ожидается:

        @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

Ответить