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でぼんやり書いてしまいそうなので気をつけたい.