BEGIN ブロックではまる (perl)
- 2007.09.28 Friday
- dev
表題の通り、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 モジュールを呼び出せたので、フラグを立てる };
基本っぽいことですが、すっかりはまってしまっていました。
スポンサーリンク