Sub::Name

NAME

Sub::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。