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

perl short-circuiting

31939 просмотра

5 ответа

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

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

Автор: mob Источник Размещён: 12.11.2019 09:17

Ответы (5)


41 плюса

Решение

Из-за низкого приоритета оператора 'или', 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

Автор: Igor ostrovsky Размещён: 03.10.2009 01:55

18 плюса

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

Оператор старшинство правил.

||крепко orсвязывает, слабо связывает. Там нет "правила большого пальца".

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

or:

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

||:

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

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

Автор: jrockway Размещён: 03.10.2009 03:35

6 плюса

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

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

Автор: perimosocordiae Размещён: 03.10.2009 01:53

1 плюс

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

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

Автор: Ed S. Размещён: 03.10.2009 01:53

1 плюс

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

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

смотрит вниз

Привет, я был прав.

Автор: Stefan Kendall Размещён: 03.10.2009 01:46
Вопросы из категории :
32x32