SimpleBoxes

BEGIN ブロックではまる (perl)

表題の通り、BEGIN ブロックの扱いではまったので、忘れないようにメモ。

package test;
use vars qw( $CHECK );
$CHECK = undef; # 初期化
BEGIN {
  eval { require test::optional; };
  $CHECK = 1 if (!$@); # optional モジュールを呼び出せたので、フラグを立てる
};

上記のようなコードを記述していたのですが、意図した通り動いてくれていませんでした。

BEGIN ブロック内では、$CHECKは「1」になっているのですが、後から(例えば、test モジュールを要求したモジュールから)参照すると、$CHECKが未定義に見えます。

BEGIN ブロックが存在した場合、そのコードは真っ先に実行されます。その後、BEGIN ブロック外のコードが、必要ならば、実行されます。

そのため、BEGIN ブロックで「1」になった $CHECK は、その後、 「$CHECK = undef; # 初期化」と記述された行が実行されることにより、未定義になります。「初期化」と書かれながら、初期化になっていませんでした。

正しくは、以下の通り。

package test;
use vars qw( $CHECK );
BEGIN {
  $CHECK = undef; # 初期化
  eval { require test::optional; };
  $CHECK = 1 if (!$@); # optional モジュールを呼び出せたので、フラグを立てる
};

基本っぽいことですが、すっかりはまってしまっていました。

スポンサーリンク

<< WebKit で CodePress を利用するために :: ユーザースタイルシート for mixi >>