型グロブでサブルーチンのエイリアス

無名サブルーチンをレキシカル変数$refに入れると&$refで呼び出す感じになるわけですが、なんだか不恰好。やたらめったら使うべきではないんだろうけど、型グロブでエイリアスをつくってやれば、普通のサブルーチン呼び出しのようにして使えますね。

my $target = 'abcbac<ok>dddse';
my $regexp = '<(.+?)>';
*regexp_p = sub { $_[0] =~ m/$_[1]/; defined $1 and print $1; };
regexp_p($target, $regexp);

一度使った型グロブの名前は未定義にしてやればまた使えます。

undef *regexp_p;

既存のサブルーチンのエイリアスにする場合はこんな感じ。

sub regexp_p_sub {
    my $target = shift;
    my $regexp = shift;
    $target =~ m/${regexp}/;
    defined $1 and print $1;
}
*regexp_p = \&regexp_p_sub;
regexp_p($target, $regexp);

こういった事は通常あまりやらないと思いますが、Class::Accessorのアクセサを生成するサブルーチン(_mk_accessorsとfollow_best_practice)でうまく型グロブを使っていて、勉強になりました。

http://search.cpan.org/src/KASEI/Class-Accessor-0.31/lib/Class/Accessor.pm


参考にさきほどのサンプルを少しいじるとこういうこともできるなという。

sub make_glob {
    no strict 'refs';
    *{ $_[0] } = sub { $_[0] =~ m/$_[1]/; defined $1 and print $1; };
}
make_glob('regexp_p');
regexp_p($target, $regexp);