在Perl中,我们可以获取当前包的名称和当前行号使用预定义的变量,如__PACKAGE__和__LINE__.
像这样我想得到当前子程序的名称:
use strict;
use warnings;
print __PACKAGE__;
sub test()
{
print __LINE__;
}
&test();
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,我想获得函数内部子程序的名称test.
Eug*_*ash 54
使用caller()功能:
my $sub_name = (caller(0))[3];
这将为您提供当前子例程的名称,包括其包(例如'main::test').闭包返回的名称'main::__ANON__'和eval 一样'(eval)'.
Sin*_*nür 18
调用者是@eugene的正确方法,指出你是否想在子例程中执行此操作.
如果您希望程序的另一部分能够识别coderef的包和名称信息,请使用Sub :: Identify.
顺便说一下,看着
sub test()
{
print __LINE__;
}
&test();
Run Code Online (Sandbox Code Playgroud)
有几点需要注意:首先,除非你试图模仿内置组件,否则不要使用原型.其次,除非您特别需要它提供的效果,否则不要&在调用子例程时使用.
因此,该代码段更好地写为:
sub test
{
print __LINE__;
}
test();
Run Code Online (Sandbox Code Playgroud)
小智 5
我也只是在寻找这个问题的答案,我也找到了调用者,但我对完全限定的路径不感兴趣,只是子的当前包名称,所以我使用了:
my $current_sub = (split(/::/,(caller(0))[3]))[-1];
似乎工作得很好,只要添加它,以防其他人遇到这个问题:)
| 归档时间: |
|
| 查看次数: |
23677 次 |
| 最近记录: |