В чем разница между операторами короткого замыкания между операторами 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
, какие эмпирические правила вы используете, чтобы решить, какую конструкцию использовать, и убедитесь, что код выполняет то, что вы думаете, что он делает?
Ответы
Ответ 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 или что-то такое сумасшедшее.
смотрит вниз
Эй, я был прав.
Ответ 5
Обе версии коротко замыкаются в Perl, но "текстовые" формы ( "и" и "или" ) имеют более низкий приоритет, чем их эквиваленты в стиле C.
http://www.sdsc.edu/~moreland/courses/IntroPerl/docs/manual/pod/perlop.html#Logical_And