Подтвердить что ты не робот

В чем разница между операторами короткого замыкания между операторами Perl (или, и) и (||, &&)?

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

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, какие эмпирические правила вы используете, чтобы решить, какую конструкцию использовать, и убедитесь, что код выполняет то, что вы думаете, что он делает?

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

|| плотно связывается, or слабо связывается. Нет "эмпирического правила".

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

or:

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

||:

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

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

Ответ 3

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

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

Ответ 4

Я предполагаю, что or3 отличается.

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

смотрит вниз

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