NeverBlog::Likk::Unexistable;

見なかったことにして下さい

Perlで 'use strict;' をしない状態で 'return nil' をした時の挙動

こんばんわ、忘年会シーズンというにはもう遅いタイミングですね。

先日 gotanda-pm 忘年会の酒の席の話で
"Perlで 'use strict;' をしない状態で 'return nil' をした時どうなるか?" といった話が上がり
酒の席のせいか妙にテンションが上りツボに入ってしまい以下のようなツイートをしました。

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 は文字列を真として扱ってくれますので、結果としてツイートの内容が"偽" であるというオチがついてしまいました。

ということで以下の締めになります。



以下蛇足:


`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!