読者です 読者をやめる 読者になる 読者になる

Perlにおける括弧なし関数とその引数と||の結合強度

Perlで何気なく

use File::Which qw(which);

my $cmd = which "foobar" || croak "FAIELD";

とか書いてたら,which "foobar"の返り値はundefなのにも関わらず,croakに引っかからなかった. あれ?とか思ってたら単に,括弧なし関数の右からみた結合強度よりも||のほうが強かっただけだった. つまり,まず"foobar"を見て評価値が真なのでその時点でcroak文は評価されないことになる.

以下優先順位の降順

左結合 || //
非結合 .. ...
右結合 ?:
右結合 = += -= *= などの代入演算子
左結合 , =>
非結合 リスト演算子 (右方向に対して)
右結合 not
左結合 and
左結合 or xor
perlop - Perl の演算子と優先順位 - perldoc.jp

ここで引数"foobar"からみたwhichは,リスト演算子(右方向に対して)扱いになる. したがって,||の代わりにリスト演算子よりも結合が弱いorを使うか,もしくはwhich("foobar")のように括弧をつければよい.

何も特別なことはないけれど,PerlやRubyでぼんやり書いてしまいそうなので気をつけたい.