Это, вероятно, незначительная точка, но мне было интересно, почему логические операторы Perl (&&
, ||
и !
) имеют приоритет над легко понятными "английскими" логическими операторами (and
, or
и not
). Есть ли преимущество использования предыдущего набора и любой недостаток использования последнего набора в script?
Почему логические операторы Perl &&, ||,! имеют приоритет над и, или, а не?
Ответ 1
Если ||
и or
имели одинаковый приоритет, то
return some_func $test1 || $test2;
означало бы
return some_func($test1) || $test2;
вместо
return some_func($test1 || $test2);
или
some_func $test1 or die;
означало бы
some_func($test1 or die);
вместо
some_func($test1) or die;
Ни одно из этих изменений не желательно.
И хотя обсуждение or
легче понять, чем ||
, его труднее читать. Легче читать код, когда операторы не похожи на их операнды.
Ответ 2
Оригинальные операторы &&
, ||
и !
имеют высокий приоритет для соответствия языку C.
Для упрощения некоторых общих конструкций были добавлены более новые (но еще старые) операторы and
, or
и not
. Например, сравните:
open my $fh, '<', $filename || die "A horrible death!";
open my $fh, '<', $filename or die "A horrible death!";
Первый из них неверен; высокий приоритет ||
связывается с $filename
и die
, который не является тем, что вы хотите. Второй правильный; низкий приоритет or
означает, что отсутствующие скобки не приводят к двусмысленности.
Ответ 3
Логическое превосходство и ясность
Хотя я понятия не имею, было ли это причиной того, что они получили этот язык, они невероятно полезны для написания понятного кода,
## Some sample data...
my ($foo, $bar, $baz) = (0,1,1);
## Different results..
say ( $foo && $bar || $baz );
say ( $foo and $bar || $baz );
Мы можем использовать это в коде, даже с \n
. Не нужно шумных паренов.
## When would you use this...
if (
$cache->is_outdated
and $db_master->has_connection || $db_slave->has_connection
) {
$cache->refresh
}
В противном случае это должно быть так,
$cache->is_outdated
&& ( $db_master->has_connection || $db_slave->has_connection )
Но Perl не нравится весь этот шум, который другие языки навязывают своим пользователям.
Ответ 4
преобразование комментария в ответ:
Если бы эти операторы были одинаковыми по предпочтению, нет необходимости сохранять обе версии - иметь только одну версию.
Но Ларри Уолл - лингвист, и ему очень нравилось использовать простые английские слова на его новом языке. Итак, он представил эти операторы английского стиля (наряду с unless
и другими).
Чтобы сохранить операторы стиля C и их классический смысл, ему нужно было сделать новые ключевые слова не лишними. Из-за этого он придавал этим операторам несколько иной смысл, который ему нравился лучше. Таким образом, эта разница оказалась приоритетом оператора.