可能重复:
In Perl, how can a subroutine get a coderef that points to itself?
有没有办法从该函数中获取对函数的引用而不使用使用该名称?
我最近发现自己反复编写有反模式的代码。 Data::Dump支持过滤器,但(从版本1.16开始)它们不会递归应用。为了解决这个问题,我一直在写这样的事情:
sub filter {
my ($context, $node) = @_;
# ...
return { dump => dumpf($something, \&filter) };
}
这样可行,但\&filter
引用开始让我感到烦恼。如果将函数重命名或复制到其他位置作为新过滤器的模板,则会产生维护开销。我想用__SUB__
之类的东西替换它(如果Perl有这样的话)。
答案 0 :(得分:3)
对于命名子例程,您可以使用caller
获取名称,然后引用它:
sub foo {
state $self = \&{(caller(0))[3]};
#...
# call $self->();
}
这不适用于匿名子程序,它会获得main::__ANON__
之类的“名称”。