やしむすがもがいてるブログ

変化の早いエンジニア業界に置いてかれまいともがいてる人のブログです。モバイルのweb,front,native周りを書いていきます

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でつなげるときは単項同士でつなげるか、()で優先度を明示したほうが良さそうですね。