Perlで 'use strict;' をしない状態で 'return nil' をした時の挙動
こんばんわ、忘年会シーズンというにはもう遅いタイミングですね。
先日 gotanda-pm 忘年会の酒の席の話で
"Perlで 'use strict;' をしない状態で 'return nil' をした時どうなるか?" といった話が上がり
酒の席のせいか妙にテンションが上りツボに入ってしまい以下のようなツイートをしました。
Perlで、'use strict;' をしなければ 、'return nil' で undef が返るという話が今年聞いたperlの一番面白い話になってしまった。
— ╹) っ < (@likk) December 27, 2016
ruby を普段書いてる人が perl を書くと起き得る事故ですね。
通常 `use strict;` をした状態だと `nil` ベア(裸の)ワードの最適化を制限してくれてコンパイルエラーを出してくれます。
ですが `use strict;` をしないどうなるか?
最適化の結果 nil は値が設定されてないし、関数も無いし予約語でも無いので偽が返すと解釈し上記のようなツイートにつながりました、
では、実際に実行してみるとどうでしょうか。
$ perl -E 'say sub { return nil}->()'; nil
おや、nil が返ってきますね。ツイートした内容と相違があります。
これは perl ではどのように解釈してるでしょうか
$ perl -MO=Deparse -E 'say sub { return nil}->()'; use feature 'current_sub', 'evalbytes', 'fc', 'say', 'state', 'switch', 'unicode_strings', 'unicode_eval'; say sub { return 'nil'; } ->(); -e syntax OK
文字列 "nil" と解釈してるのが分かります。
perl は文字列を真として扱ってくれますので、結果としてツイートの内容が"偽" であるというオチがついてしまいました。
ということで以下の締めになります。
酒の席で聞いた話を検証できる環境が手元にあるにも関わらず検証せずにツイートするのは良くないですね。
— ╹) っ < (@likk) December 28, 2016
以下蛇足:
`print nil;` が何も出力されないので、nil が undef っぽい挙動になります。
$ perl -e 'print nil'; $
これはどう解釈してるか同様に見てみるとすぐに分かります。
$ perl -MO=Deparse -e 'print nil'; print nil $_; -e syntax OK
nil をファイルハンドルとして扱ってそこに print してるから。
つまり`print nil $_` として解釈をしてるので何も出力されない挙動となります。
use strict!