動的関数定義(?)

引き続き、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