如何从函数中获取函数的引用?

时间:2010-06-22 15:18:46

标签: perl

  

可能重复:
  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有这样的话)。

1 个答案:

答案 0 :(得分:3)

对于命名子例程,您可以使用caller获取名称,然后引用它:

sub foo {
    state $self = \&{(caller(0))[3]};
    #...
    # call $self->();
}

这不适用于匿名子程序,它会获得main::__ANON__之类的“名称”。