これはおそらく些細な点ですが、なぜ Perl の論理演算子 ( &&
、||
、および!
) がわかりやすい「英語」の論理演算子 ( and
、or
および) よりも優先されるのか疑問に思っていましたnot
。スクリプトで前者のセットを使用する利点と後者のセットを使用する欠点はありますか?
4 に答える
元の&&
,||
および!
演算子は、C 言語に合わせて優先順位が高くなります。
and
いくつかの一般的な構造を簡素化するために、新しい (ただしまだ古い)or
とnot
演算子が追加されました。たとえば、次のように比較します。
open my $fh, '<', $filename || die "A horrible death!";
open my $fh, '<', $filename or die "A horrible death!";
これらの最初のものは正しくありません。優先度が高く||
、$filename
これdie
はあなたが望むものではありません。2 番目は正しいです。優先順位が低いor
ということは、括弧がなくてもあいまいさが生じないことを意味します。
||
とor
が同じ優先順位を持っていた場合、
return some_func $test1 || $test2;
を意味します
return some_func($test1) || $test2;
それ以外の
return some_func($test1 || $test2);
また
some_func $test1 or die;
を意味します
some_func($test1 or die);
それ以外の
some_func($test1) or die;
これらの変更はどちらも望ましくありません。
そして、議論することor
はより簡単に理解できますが||
、読むのは難しいです。演算子がオペランドのように見えない場合は、コードを読みやすくなります。
コメントを回答に変換する:
これらの演算子の優先度が同じである場合、両方のバージョンを保持する必要はありません。1 つのバージョンだけで十分です。
しかし、ラリー・ウォールは言語学者であり、彼は新しい言語で平易な英語の単語を使用するのが本当に好きでした. そこで、彼はこれらの英語スタイルの演算子を (unless
およびその他と共に) 導入しました。
C スタイルの演算子とその古典的な意味を維持するために、彼は新しいキーワードを冗長にならないようにする必要がありました。そのため、彼はこれらの演算子に少し異なる意味を割り当てました。したがって、その違いは演算子の優先順位であることが判明しました。