2012年05月31日

Perl の循環依存ではまった

こんなコードでハマってしまいましたとさ。
$ cat Hidek.pm
package Hidek;
use strict;
use warnings;
use 5.010;
BEGIN { say 'ふぁいやー' }
use Hidek48;
BEGIN { say 'ファイバー' }

sub mix { say 'はーーーよっしゃいくぞー' }

1;
$ cat Hidek48.pm
package Hidek48;
use strict;
use warnings;
use 5.010;
BEGIN { say 'たいがー' }
use Hidek; # Hidek から呼ばれてて %INC のなかに入ってるからスルーされる
BEGIN { say 'さいばー' }

#Hidek::mix(); # Hidek 読み込ちゅうで、まだ mix ができてない

1;
$ perl -MHidek -e ''
ふぁいやー
たいがー
さいばー
ファイバー
$ 

Hidek::mix を呼ぼうとしても、 Hidek.pm の中身をロードしてる最中に Hidek48.pm のロードを行ってて、 Hidek48.pm のなかでも Hidek.pm をロードしてるんだけど、すでにロードが始まっててロード処理スキップされるから、うっかり mix 呼んでもそんな関数が無い!って怒られるわけ。

うっかりさんこわい。
Posted by Yappo at 17:07 | Comments (0) | TrackBack