15

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 $@ && $@ !~ /alarm clock restart/; # reraise

私は、論理OR演算子'||'よりも優先順位の低い論理OR演算子'または'を常に使用する必要があると教えられていました。

この本をさらに見ると、同じロジックを使用している他の例がたくさんあります。

ルールや優先順位を変更しましたか?

または'||'の処理です および'または'はPerlの新しいバージョンで変更されましたか?(残念ながら、レガシーコードのために5.6.1 atmに溶接されています)。

4

2 に答える 2

22

||との優先順位はor変更されていません。関数属性の周りに括弧を使用していない場合、||withを使用するのは少し危険です。die

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

orそのため、制御構造を好む人もいます。括弧を付けても違いはありません。

于 2013-02-15T11:00:16.533 に答える
1

[スタイルの質問として、これはおそらく CW にする必要があります。とはいえ、私には意見があります。]

キャメルはスタイルへのひどいガイドです。それはその仕事ではありません。それが提示するコードは、缶に書かれていることを行うという点で正しいでしょうが、その例を実際に使用するものに変えることは、ほとんどが読者の演習として残されています.

特定の質問については、ロジックには英語版を優先し、値が必要な場合には 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

これにより、最小限の括弧でほとんどのコードを確認できます。

于 2013-02-15T18:11:14.850 に答える