2010-06-22 18 views
3

可能重复:
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有这样的东西)替换它。

+3

重复的:http://stackoverflow.com/questions/2554214/in-perl-how-can-a-subroutine-get-a-coderef-that-points-to-it-自己?? – runrig 2010-06-22 15:49:20

+1

@runrig:非常好。我可以发誓在那里有一个类似的问题,但找不到它。 – 2010-06-22 17:08:05

回答

3

对于命名的子程序,你可以使用caller获得的名称,然后取一个参考吧:

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

这并不适用于匿名子,这让“名”之类main::__ANON__工作。

相关问题