perl で演算子の優先順位をしらべる
perl -MO=Deparse,-p してあげればよい。
今回 not defined $a->{foo} && $a->{a} というコードがあった。意図としては (not defined $a->{foo}) && $a->{a} としたかったようだが、実際には not (defined $a->{foo} && $a->{a}) という挙動になる。つぎのようにすれば簡単にしらべられる。
% perl -MO=Deparse,-p -le '$a = { a => 1 }; not defined $a->{foo} && $a->{a}; !defined $a->{foo} && $a->{a}'
BEGIN { $/ = "\n"; $\ = "\n"; }
($a = {'a', 1});
(not (defined($$a{'foo'}) && $$a{'a'}));
(defined($$a{'foo'}) or $$a{'a'});
-e syntax OK
not defined $a->{foo} && $a->{a} は (not (defined($$a{'foo'}) && $$a{'a'})) と解釈され、!defined $a->{foo} && $a->{a} は (defined($$a{'foo'}) or $$a{'a'}) と解釈されていることがわかる。