Go to the previous, next section.

優先度

perl の演算子の結合規則と優先度は次の通りである。

優先度  結合規則        演算子

低い    なし            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";

はおそらく見た目の動作はしない。

Go to the previous, next section.