[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