среда, сентября 03, 2014

Perl. Не используйте конструкцию "return $a or $b"

На компе недавно обновился перл до версии 5.20 и в рабочем коде словил варнинг "Possible precedence issue with control flow operator". Гугление показало, то, оказывается, перл код вида
sub mysub {
    my ( $a, $b ) = @_;
    return $a or $b;
}
интерпретатором будет воспринят как
sub mysub {
    my ( $a, $b ) = @_;
    ( return $a ) or $b;
}
т.е. функция/метод всегда будет возвращать $a в не зависимости от того, истиннен он или ложен. Поэтому в данном случае надо использовать оператор || вместо or хотя я всегда считал, что два обозначения одного и того же оператора. И в итоге наша функция будет выглядеть так:
sub mysub {
    my ( $a, $b ) = @_;
    return $a || $b;
}

1 комментарий:

Oleg комментирует...

Операторы то одинаковые, только у "or" самый низший приоритет: http://perldoc.perl.org/perlop.html#Operator-Precedence-and-Associativity