優先度 結合規則 演算子 低い なし print printf exec system sort reverse chmod chown kill unlink utime die return 左から右 , 右から左 = += -= *= など 右から左 ?: なし .. 左から右 || 左から右 && 左から右 | ^ 左から右 & なし == != <=> eq ne cmp なし < > <= >= lt gt le ge なし chdir exit eval reset sleep rand umask なし -r -w -x など 左から右 << >> 左から右 + - . 左から右 * / % x 左から右 =~ !~ 右から左 ! ~ および単項演算子 - 右から左 ** なし ++ -- 高い 左から右 '('
リストを引数にとる演算子(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
しかし、*
は ||
よりも優先度が高いので、
chdir $foo * 20; # chdir ($foo * 20) chdir($foo) * 20; # (chdir $foo) * 20 chdir ($foo) * 20; # (chdir $foo) * 20 chdir +($foo) * 20; # chdir ($foo * 20) rand 10 * 20; # rand (10 * 20) rand(10) * 20; # (rand 10) * 20 rand (10) * 20; # (rand 10) * 20 rand +(10) * 20; # rand (10 * 20)
括弧がない場合、print
, sort
, chmod
といった
リストを引数に持つ演算子の優先度は
演算子の左側を見るか右側を見るかによって非常に高いか、
非常に低いかのどちらかである。
たとえば、次の例で、
@ary = (1, 3, sort 4, 2); print @ary; # prints 1324
sort
の右側にあるコンマは sort
の前に評価されるが、
左側のコンマは sort
の後で評価される。
言い換えると、リストを引数に取る演算子は
それに続く引数をすべて自分のものにしてしまい、
その後は前にある expression に単純に従う傾向がある。
括弧には注意しなければならない。
# これらは print を評価する前に exit を評価してしまう print($foo, exit); # 明らかにこれは正しくない print $foo, exit; # これでもない # これらは exit を評価する前に print を実行する (print $foo), exit; # これが正しい print($foo), exit; # またはこれ。 print ($foo), exit; # これでも正しい。
また、
print ($foo & 255) + 1, "\n";
はおそらく見た目の動作はしない。