2010-06-22 49 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__工作。

相關問題