在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