2010-04-01 70 views
25

在Perl中,我們可以獲取當前包的名稱和當前行號使用預定義變量,如__PACKAGE____LINE__如何在Perl中獲取當前子程序的名稱?

喜歡我想得到當前子程序的名稱:

use strict; 
use warnings; 

print __PACKAGE__; 
sub test() 
{ 
    print __LINE__; 
} 
&test(); 

在上面的代碼中,我想要得到的功能test內的子程序的名稱。

+1

你想要什麼輸出如果當前子程序是匿名的? – 2010-04-01 10:51:29

+5

'sub test(){}'定義了一個具有「()」原型的函數。我想你想要'sub test {}' – 2010-04-01 11:40:06

+0

另外,不要在你調用子程序之前加一個&符號('&'),因爲它可能不會做你認爲的那樣。 – mpeters 2010-04-02 05:53:40

回答

16

caller@eugene pointed out的正確方法,如果你想在子程序中這樣做。

如果您希望程序的另一部分能夠識別coderef的包和名稱信息,請使用Sub::Identify

順便說一句,看着

sub test() 
{ 
    print __LINE__; 
} 
&test(); 

有幾個重要的點,提:首先,除非你正在試圖模仿內建不使用prototypes。其次,除非你特別需要它提供的效果,否則當invoking a subroutine時不要使用&

因此,片段是更好的寫法如下:

sub test 
{ 
    print __LINE__; 
} 
test(); 
49

使用caller()功能:

my $sub_name = (caller(0))[3];

這會給你的名字當前子程序的,包括它的包裝(如'main::test')。閉包返回名稱,如'main::__ANON__',在評估中它將是'(eval)'

+3

它給你一個匿名子(或者foo :: __ ANON__的main :: __ ANON__,如果匿名子被定義在包'foo ') – mirod 2010-04-01 11:31:50

+7

@mirod:'local * __ ANON__ =「foo」;' - 這可以用來爲匿名子例程設置一些名稱。 – 2010-04-01 11:54:47

+0

不錯! (不是我會這樣做當然...) – mirod 2010-04-01 13:14:37

0

有特殊__SUB__perl-5.16存在。

use v5.16; 
use Sub::Identify qw/sub_fullname/; 
sub foo { 
    print sub_fullname(__SUB__); # main::foo 
} 

foo(); 

其實你可以傳遞給sub_fullname任何子程序引用(甚至是匿名):

use Sub::Identify qw/sub_fullname/; 
sub foo { 
    print sub_fullname(\&foo); # main::foo 
    print sub_fullname(sub{}); # main::__ANON__ 
} 

foo(); 
+0

如果有人想將名稱命名爲__ANON__,請參見[here](http://www.perlmonks.org/?node_id = 395912) – 2018-01-19 09:04:08

相關問題