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

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

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

Обычный совет заключается в том, чтобы использовать только оператор «или» для streamа управления:

 @info = stat($file) or die; 

Дополнительную информацию см. В руководстве по perl: http://perldoc.perl.org/perlop.html#Logical-or-and-Exclusive-Or

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

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

|| связывается плотно 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: $!")) «просто чтобы быть уверенным», пожалуйста.

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

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

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

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

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

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

смотрит вниз

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

Давайте будем гением компьютера.