Sub::Name
NAME
DESCRIPTION
サブルーチンのリファレンスに名前をつけることができる。その名前で呼べるようにするのではなく、callerやCarpなどで使うための名前をつける。
SYNOPSYS
Carpすると通常サブルーチンのリファレンスは__ANON__になるがsubnameしたあとだと名前がつく。
use strict; use warnings; use Carp; use Sub::Name; use Perl6::Say; sub normal_sub { croak 'exception!'; } my $sub_ref = sub { croak 'exception!'; }; my $named_sub_ref= sub { croak 'exception!'; }; subname 'named_sub_ref', $named_sub_ref; say '-- normal_sub --'; eval { normal_sub(); }; say $@ if $@; say '-- sub_ref --'; eval { $sub_ref->(); }; say $@ if $@; say '-- named_sub_ref --'; eval { $named_sub_ref->(); }; say $@ if $@;
実行結果
$ perl sub_name.pl -- normal_sub -- exception! at sub_name.pl line 8 main::normal_sub() called at sub_name.pl line 23 eval {...} called at sub_name.pl line 22 -- sub_ref -- exception! at sub_name.pl line 12 main::__ANON__() called at sub_name.pl line 30 eval {...} called at sub_name.pl line 29 -- named_sub_ref -- exception! at sub_name.pl line 16 main::named_sub_ref() called at sub_name.pl line 37 eval {...} called at sub_name.pl line 36
MEMO
デバッグや計測時に役に立ちそうだ。Class::Accessor::Namedも参照。実装はCかな?DynaLoader。