在Perl中,我们可以获取当前包的名称和当前行号使用预定义变量,如__PACKAGE__
和__LINE__
。如何在Perl中获取当前子程序的名称?
喜欢我想得到当前子程序的名称:
use strict;
use warnings;
print __PACKAGE__;
sub test()
{
print __LINE__;
}
&test();
在上面的代码中,我想要得到的功能test
内的子程序的名称。
在Perl中,我们可以获取当前包的名称和当前行号使用预定义变量,如__PACKAGE__
和__LINE__
。如何在Perl中获取当前子程序的名称?
喜欢我想得到当前子程序的名称:
use strict;
use warnings;
print __PACKAGE__;
sub test()
{
print __LINE__;
}
&test();
在上面的代码中,我想要得到的功能test
内的子程序的名称。
caller是@eugene pointed out的正确方法,如果你想在子程序中这样做。
如果您希望程序的另一部分能够识别coderef的包和名称信息,请使用Sub::Identify。
顺便说一句,看着
sub test()
{
print __LINE__;
}
&test();
有几个重要的点,提:首先,除非你正在试图模仿内建不使用prototypes。其次,除非你特别需要它提供的效果,否则当invoking a subroutine时不要使用&
。
因此,片段是更好的写法如下:
sub test
{
print __LINE__;
}
test();
使用caller()
功能:
my $sub_name = (caller(0))[3];
这会给你的名字当前子程序的,包括它的包装(如'main::test'
)。闭包返回名称,如'main::__ANON__'
,在评估中它将是'(eval)'
。
有特殊__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();
如果有人想将名称命名为__ANON__,请参见[here](http://www.perlmonks.org/?node_id = 395912) – 2018-01-19 09:04:08
你想要什么输出如果当前子程序是匿名的? – 2010-04-01 10:51:29
'sub test(){}'定义了一个具有“()”原型的函数。我想你想要'sub test {}' – 2010-04-01 11:40:06
另外,不要在你调用子程序之前加一个&符号('&'),因为它可能不会做你认为的那样。 – mpeters 2010-04-02 05:53:40