ラベル

2013年7月3日水曜日

Perlで気持ち悪かったこと

こないだ社内でこんな話題になった。

use strict; my $tmp = 'hoge' if 0; print $tmp if $tmp;
$tmpは未定義のはずなのにifで評価してもスクリプトエラーにならない。
use strict; print $tmp if $tmp;
でもこれだとスクリプトエラー。
こっちはuse strictしているので、大域変数はちゃんとパッケージ名で修飾されていないとエラーなのは判る。 

Perldocのmyの部分読んでみたら ↓
>my はコンパイル時の効果と実行時の効果の両方を持っています。 コンパイル時においては、コンパイラはその変数を認識します。 これの基本的な実用性は use strict 'vars' を黙らせるということですが、 perlref で詳細を記述しているクロージャの作成にも有用です。 実際の初期化は実行時まで遅らされ、そのためたとえばループを通る度に 適切に実行されるのです。

つまりmyはスクリプトが読まれた時点で解釈されて(主にuse strictでエラー出さない為に)初期化されようがされまいがレキシカルな変数のシンボルとして定義されるらしい。

きもちわる。

0 件のコメント: