Если вы используете '||' или более низкий приоритет "или" при сообщении об ошибке в 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
Это позволит вам просмотреть большинство кодов с минимальной скобкой.