2010-04-01 190 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

相关问题