В чем разница между операторами Perl (или, и) и (||, &&)? - PullRequest
30 голосов
/ 03 октября 2009

Какая из этих подпрограмм не похожа на другую?

sub or1 {
    my ($a,$b) = @_;
    return $a || $b;
}

sub or2 {
    my ($a,$b) = @_;
    $a || $b;
}

sub or3 {
    my ($a,$b) = @_;
    return $a or $b;
}

sub or4 {
    my ($a,$b) = @_;
    $a or $b;
}

Я пришел в Perl 5 из C и Perl 4 и всегда использовал ||, пока не увидел больше скриптов, использующих or, и мне понравилось, как это выглядит. Но, как показывает вышеупомянутая викторина, она не лишена ловушек для неосторожных. Для людей, которые используют обе конструкции или используют много or, какие практические правила вы используете, чтобы решить, какую конструкцию использовать, и убедитесь, что код выполняет то, что вы думаете?

Ответы [ 5 ]

41 голосов
/ 03 октября 2009

Из-за низкого приоритета оператора 'или' or3 анализирует следующим образом:

sub or3 {
    my ($a,$b) = @_;
    (return $a) or $b;
}

Обычный совет - использовать только оператор 'или' для потока управления:

@info = stat($file) or die;

Подробнее об этом см. Руководство по perl: http://perldoc.perl.org/perlop.html#Logical-or-and-Exclusive-Or

18 голосов
/ 03 октября 2009

Какие эмпирические правила вы используете, чтобы решить, какую конструкцию использовать, и убедитесь, что код выполняет то, что вы думаете

Приоритет оператора правила.

|| крепко связывается, or слабо связывается. Эмпирического правила не существует.

Если у вас должно быть эмпирическое правило, как насчет «использовать or только когда lvalue отсутствует»:

or

open my $fh, '>', 'file' or die "Failed to open file: $!"

||

my $greeting = greet() || $fallback || 'OH HAI';

Я согласен с МЖД в том, чтобы избегать паренов; если вы не знаете правил, посмотрите их ... но не пишите (open(my $fh, '>', 'file')) or (die("Failed to open file: $!")) "просто чтобы быть уверенным", пожалуйста.

6 голосов
/ 03 октября 2009

В Perl 5 «или» и «и» имеют более низкий приоритет, чем «||» а также "&&". Проверьте эту ветку PerlMonks для получения дополнительной информации:

http://www.perlmonks.org/?node_id=155804

1 голос
/ 03 октября 2009

Обе версии имеют короткое замыкание в Perl, но «текстовые» формы («и» и «или») имеют более низкий приоритет, чем их эквиваленты в стиле C.

http://www.sdsc.edu/~moreland/courses/IntroPerl/docs/manual/pod/perlop.html#Logical_And

1 голос
/ 03 октября 2009

Я думаю, что or3 отличается.

На самом деле я не Perl, но похоже, что 1, 2 и 4 явно возвращают логические значения. Я предполагаю, что у 3 есть побочные эффекты, такие как возврат $ a или что-то сумасшедшее.

смотрит вниз

Эй, я был прав.

...