モジュールファイルに変更があった際にそのモジュールを自動で読み込みなおしたい、そんな時・・・
サーバ系やら常駐系のアプリ開発しない限りは必要性は無いと思うけれど。
CPANのModule::Reloadは、モジュールがエラーでこけると、そのモジュールの再読み込みが行われない、だとか、
モジュール再読み込みの際にどのモジュールが読み込まれたか知りたい場合それを外からハンドリング不能、
だとか、微妙なので、こんなもんは書いて、自分のライブラリに追加した方が早いと思うんだ、わたくし。
sub module_reload {
my %reloaded = ();
for (keys %INC) {
my $lm = -M $INC{$_};
my $path = $INC{$_};
$lm == $LAST_MODIFY{$_} and next;
if ($LAST_MODIFY{$_}) {
delete $INC{$_};
eval { require $path; };
if ($@) { $INC{$_} = $path; warn $@; }
else { $reloaded{$_} = $path; }
}
$LAST_MODIFY{$_} = $lm;
}
return %reloaded ? \%reloaded : undef;
}
if (my $target = module_reload) {
warn 'RELOADED: ' . Dumper $target;
}
こんな感じで。
%INCには読み込み済みのモジュール情報が詰まってる。
Keyには、パッケージ名をファイルパスに直した謎フォーマットのデータ、
Valueには、パッケージへのファイルフルパス。
それをぶん回して最終更新日をチェックするだけ、と言う代物。まぁ、何とも単純。
返り値は、再読み込みしたモジュールがあれば、
その情報をINCのKey-Valueそのままにハッシュのリファレンスで返す。
無ければundef。
そーんなかんじでー。よろぴこめかどっく。
PR