動的関数定義(?)の続き

昨日に引き続き、いろいろ試したのでメモ。

例えば、こんなの。

use strict;
use warnings;
use v5.10;

{
    no strict 'refs';
    *{foo} = sub {
        say 'foo';
    };
}

foo();

実行結果はこんな感じ。
$ perl aaa.pl
foo

そういえば、ハッシュだった、気がする。(*1)

あと、パッケージ名を付けるならこんな感じ。

use strict;
use warnings;
use v5.10;

my $pkg = __PACKAGE__;
say $pkg;

{
    no strict 'refs';
    *{"${pkg}::foo"} = sub {
        say 'foo';
    };
}

foo();

実行結果はこんな感じ。
$ perl bbb.pl
main
foo

さらに、こんなこんなことも。

$ cat ccc.pl 
use strict;
use warnings;
use v5.10;

eval {
    foo();
};

if ( $@ ) {
    say '--- exception caught! ---';
    say $@;
    say '-------------------------';
}

sub hoge {
    no strict 'refs';

    my $caller = caller( 0 );
    say '$caller = ', $caller;

    *{"${caller}::foo"} = sub {
        say 'foo';
    };
}

hoge();
foo();

実行結果はこんな感じ。
$ perl ccc.pl
--- exception caught! ---
Undefined subroutine &main::foo called at ccc.pl line 6.

-------------------------
$caller = main
foo

関数をコールしたら、関数が増えたよ!

おしまい。

(*1) シンボリックテーブル?っていうの??

Leave a Comment