如何在Perl中获取当前子例程的名称?

kir*_*ika 30 perl

在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)'.

  • @mirod:`local*__ ANON__ ="foo";` - 这可以用来为匿名子程序设置一些名称. (7认同)
  • 它给你一个匿名子的主要:: __ ANON__(如果在'foo'包中定义了匿名子,则为foo :: __ ANON__) (3认同)
  • 一个很好的问题是,为什么在 gcc-2.95 有了 __FUNCTION__` 25 年后,Perl 仍然没有。;-) (2认同)

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)

  • 这个“答案”大部分与问题无关。 (2认同)

小智 5

我也只是在寻找这个问题的答案,我也找到了调用者,但我对完全限定的路径不感兴趣,只是子的当前包名称,所以我使用了:

my $current_sub = (split(/::/,(caller(0))[3]))[-1];

似乎工作得很好,只要添加它,以防其他人遇到这个问题:)