如何从子程序的引用中获取 Perl 子程序的名称?

问题描述 投票:0回答:2

我的 Perl 代码包含许多对象,例如

$wprAtnA
$wprAtnB
下面,子例程是用一组参数指定的。 其他代码,给定“wprAtn”,将“wprAtn”应用于某个对象。 即调用指定的sub。

一旦定义了“wprAtn”, 能够审查它,看看它的组成部分会很方便, 包括哪个子是已经指定的。 但正如我们在下面看到的,我的

Dumper
命令没有给我们这些信息。
print
也没有。

给定子例程的引用,有没有办法恢复它的名称或至少它的源代码, 这样使用代码的人、调试代码的人就可以从“wprAtn”中识别出子程序?

#!/usr/bin/env perl 
use strict; use warnings;
use feature 'say';
use Data::Dumper qw(Dumper); $Data::Dumper::Sortkeys = 1;

sub dog
{
    say 'we are in ',[caller(0)]->[3],;
    return 1;
}

sub feline
{
    die;
}

my$wprAtnA=
{
    code=>\&dog,
    arg =>
    {
        x=>5,
    }
};

my$wprAtnB=
{
    code=>\&feline,
    arg =>
    {
        verbose=>0,
        text=>'why?',
    }
};

say $wprAtnA->{code};
print Dumper $wprAtnA;
say $wprAtnB->{code};
print Dumper $wprAtnB;

我在这里运行它

> perl d.pl
CODE(0x7f96dc80e948)
$VAR1 = {
          'arg' => {
                     'x' => 5
                   },
          'code' => sub { "DUMMY" }
        };
CODE(0x7f96db853a80)
$VAR1 = {
          'arg' => {
                     'text' => 'why?',
                     'verbose' => 0
                   },
          'code' => sub { "DUMMY" }
        };
perl reference
2个回答
0
投票

您可以将 Deparse 设置为 true 以在输出中查看解析后的代码。

$Data::Dumper::Deparse = 1;

0
投票

Sub::Util 提供

subname
来获取完全限定名称。

Sub::Identify 提供

sub_fullname
子例程来获取完全限定名称(和其他相关子例程)。

© www.soinside.com 2019 - 2024. All rights reserved.