perlの演算子の優先度
まずは、以下の2つのコマンドを何も考えずにコンソールに入力してみてください。
perl -E 'say 10,000 or 56'
perl -E 'say 10,000 || 56'
さてどのような値が返ってくると思いますか?何だろう?10000かな?
[yashims85@yashims85:~]% perl -E 'say 10,000 or 56' 100
ファッ!?
これは、10,000
が1つの数値ではなく、sayの2つの引数としてsay(10, 0)
のように解釈されたためです。
( sayに複数の引数を渡すと、文字列として結合する。また000はint(0)で解釈される)
では、もう一つの方。。まぁ同じ結果だろう。
[yashims85@yashims85:~]% perl -E 'say 10,000 || 56' 1056
ファッ!!!?!?!?
これは、perlではor
と||
の結合優先度が異なるためです。そのためsay(10, (000 || 56))
と解釈されました。
というわけで、まとめると今回の引掛けポイントは以下の2点です。
10,000
は2つの数値だよ!or
と||
は優先度が全然違うよ!
こんなん普通に騙されるわーーー
or
の扱いが特殊なんですね。というわけで、orでつなげるときは単項同士でつなげるか、()
で優先度を明示したほうが良さそうですね。