Если вы используете '||' или более низкий приоритет "или" при сообщении об ошибке в Perl?

При чтении последней версии The Camel Book меня поразил следующий фрагмент кода на p522:

use Fcntl ":flock";
eval {
    local $SIG{ALRM} = sub { die "alarm clock restart" };
    alarm 10;               # schedule alarm in 10 seconds
    eval {
        flock(FH, LOCK_EX)  # a blocking, exclusive lock
            || die "can't flock: $!";
    };
    alarm 0;                # cancel the alarm
};
alarm 0;               # race condition protection
die if [email protected] && [email protected] !~ /alarm clock restart/; # reraise

Мне учили, что вы всегда должны использовать логический оператор с низким приоритетом OR или "предпочтительнее логического оператора OR" || ".

Глядя далее в книге, я вижу множество других примеров, использующих ту же логику.

Изменены ли правила или уровни приоритета?

Или обработка "||" и 'или' изменено в более поздних версиях Perl? (К сожалению, мы свариваем до 5.6.1 атм из-за устаревшего кода).

Ответы

Ответ 1

Приоритет || и or не изменился. Использование || с die является немного опасным, если вы не используете круглые скобки вокруг атрибутов функции, рассмотрите

flock FH, LOCK_EX || die "can't flock: $!"; # WRONG!

Вот почему некоторые люди предпочитают or для структур управления. С круглыми скобками нет разницы.

Ответ 2

[Как вопрос стиля, это, вероятно, должно быть CW'ed. Тем не менее, у меня есть мнение.]

Верблюд - страшное руководство к стилю; это не его работа. Код, который он представляет, будет правильным, поскольку он делает то, что он говорит на жестяне, но превращение его примеров в что-то фактическое использование в основном остается как упражнение для читателя.

Что касается вашего конкретного вопроса, предпочитайте английские версии для логики и резервируйте C-подобные версии для случаев, когда вы хотите получить значение. Итак:

if ($x or $y) { ... }
if (my $z = $x || $y) { ... }
$x or die "Ohnoes!"; # Though I prefer `die "Ohnoes!" unless $x;`
return 5 unless $x and $y;
return $x && $y; # Important!  `return $x and $y;` is really-really wrong

Это позволит вам просмотреть большинство кодов с минимальной скобкой.