動的関数定義(?)
引き続き、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