Почему логические операторы Perl &&, ||,! имеют приоритет над и, или, а не?

Это, вероятно, незначительная точка, но мне было интересно, почему логические операторы Perl (&&, || и !) имеют приоритет над легко понятными "английскими" логическими операторами (and, or и not). Есть ли преимущество использования предыдущего набора и любой недостаток использования последнего набора в script?

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