1. ホーム
  2. perl

[解決済み] Perlの"||"と "or "の違いは何ですか?

2022-03-08 20:04:23

質問

C言語の演算子の違いは何ですか? && , || と、そのPerl版(人間可読版)quot。 and "、" or "、......?

それは、どうやら インターネットコード は、その両方を使用しています。

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

解決方法は?

から Perlのドキュメント :

OR

リスト演算子

<ブロッククオート

リスト演算子の右側では、非常に低い優先順位で、そこにあるすべてのカンマ区切り式を制御します。優先順位の低い演算子は、論理演算子 "and"、"or"、"not"のみで、これらは、余分の括弧を必要とせずにリスト演算子を呼び出す評価に使用される場合があります。

ロジカル または 定義された または であり、排他的である。 または .

バイナリ "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

しかし、リストコンテキストの代入で、制御フローに "||" を使おうとしている場合、おそらく "or" が必要で、代入がより優先されるようにします。

@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