動的関数定義(?)
引き続き、Plack/PSGIの勉強してる訳ですが、
“Amon2/Lite.pm”を見ると、見慣れない書き方が出てきて、
こんなことも出来るのかーって思ったのでメモ。
use strict;
use warnings;
use v5.10;
{
no strict 'refs';
*{'Foo::func'} = sub {
say 'foo';
};
}
Foo::func();
実行結果はこんな感じ。
$ perl aaa.pl
foo
さらに、こんなことも。
use strict;
use warnings;
use v5.10;
my $pkg = 'Foo';
{
no strict 'refs';
*{"${pkg}::func"} = sub {
say 'foo';
};
}
Foo::func();
実行結果はこんな感じ。
$ perl bbb.pl
foo
波括弧がないと、名前空間pkgの$funcが参照されて、
なんか良く分かんないことになってしまう点に注意。
no strict 'refs';は、こういうときに使うんですね。
おしまい。
Leave a Comment