web-dev-qa-db-ja.com

「||」の違いは何ですかおよび「または」Perlで?

Cスタイルの演算子の違いは何ですか&&||、...およびPerlの人間が読み取れるバージョン "and"、 "or"、...?

インターネットコードは両方を使用しているようです:

open (FILE, $file) or die("cannot open $file");
open (FILE, $file) || die("cannot open $file");
34
Steve Schnepp

Perl Docから..

  • [〜#〜]または[〜#〜]

これはリスト演算子です。リスト演算子の右側では、優先順位が非常に低いため、そこにあるすべてのコンマ区切りの式を制御します。優先順位の低い演算子は、論理演算子「and」、「or」、および「not」のみです。これらは、余分な括弧を必要とせずにリスト演算子の呼び出しを評価するために使用できます。論理OR、定義OR、または排他的OR

バイナリ「or」は、2つの周囲の式の論理和を返します。 ||と同等です非常に低い優先順位を除きます。これにより、制御フローに役立ちます

print FH $data      or die "Can't write to FH: $!";

これは、それが短絡することを意味します:つまり、右の式は、左の式が偽の場合にのみ評価されます。優先順位のため、おそらく制御フローの場合にのみ、これを割り当てに使用しないでください。

$a = $b or $c;      # bug: this is wrong
($a = $b) or $c;        # really means this
$a = $b || $c;      # better written this way

ただし、リストコンテキスト割り当てであり、「||」を使用しようとしている場合制御フローの場合、おそらく「または」が必要になるため、割り当てがより優先されます。

@info = stat($file) || die;     # oops, scalar sense of stat!
@info = stat($file) or die;     # better, now @info gets its due

その後も、常に括弧を使用できます。

リスト演算子(print()など)または単項演算子(chdir()など)の後に次のトークンとして左括弧が続く場合、括弧内の演算子と引数が最も高い優先順位であると見なされます。通常の関数呼び出しのように。たとえば、名前付き単項演算子は||よりも優先順位が高いためです。

chdir $foo    || die;   # (chdir $foo) || die
chdir($foo)   || die;   # (chdir $foo) || die
chdir ($foo)  || die;   # (chdir $foo) || die
chdir +($foo) || die;   # (chdir $foo) || die
40
joe

唯一の違いは優先順位です。

open FILE,  $file or die("cannot open $file");   # this works
open FILE,  $file || die("cannot open $file");   # this doesn't work
open FILE, ($file || die("cannot open $file"));  # why it doesn't work
36
dave4420

!&&||、および^は、式の構築に役立つような高い優先順位を持っています。 notandor、およびxorは優先度が低いため、本質的に異なる式の間のフロー制御に役立ちます。

34
ysth

「&&」と「||」演算子は、対応する「and」、「or」よりも優先順位が高くなります。

11
Inshallah