Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从Perl模块的一个子例程中获取其名称?_Perl_Perl Module - Fatal编程技术网

如何从Perl模块的一个子例程中获取其名称?

如何从Perl模块的一个子例程中获取其名称?,perl,perl-module,Perl,Perl Module,假设我有一个Perl模块My::module: package My::Module; sub foo { return $module_name; } 如果您试图获取所处脚本的名称,我将用什么替换$module\u name以获取My::module?: my $bname=`basename $0`; print "\n".$bname; [更新]以下内容可能是您要查找的内容: package My::Module; sub new { my $self = {};

假设我有一个Perl模块
My::module

package My::Module;

sub foo {
   return $module_name;
}

如果您试图获取所处脚本的名称,我将用什么替换
$module\u name
以获取
My::module

my $bname=`basename $0`;

print "\n".$bname;
[更新]以下内容可能是您要查找的内容:

package My::Module;

sub new {
    my $self = {};
    bless $self;
    return $self;
}

sub foo {
    my $self = shift;
    return (caller(0))[3];
}

1;


# test 1: calling foo directly.
print "1: ", My::Module::foo, "\n";
# test 2:  instantiating object, then calling method of object instance.
my $x = My::Module->new;
print "2: ", $x->foo(), "\n";
输出:

$ perl test.pl
1: My::Module::foo
2: My::Module::foo

看一看特殊常数包。
这可能就是你想要的。

我相信这会得到Module.pm,但让我做一个测试……而且,因为它得到了脚本的名称(即用户键入的命令行),它永远不会返回
使用
d或
需要
d模块的名称。你回答得很好,但是我忘了我也需要子程序。你能为我添加这个吗?我决定写另一个函数来报告names
sub WhoAmI{return(caller(1))[3];}
Eric:
caller
只有在同一个包中的另一个子调用该子时才会工作。如果它是由不同包中的代码调用的,
caller
将返回该名称。如果您希望代码能够访问代码所属的包的名称,只需使用
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
。这就是它的用途,不需要调用任何子组件。@DaveSherohman-我同意,但我需要
My::Module::foo
。所以要么我每次都写
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。或者我可以调用
WhoAmI()
,它返回前面的子例程名称,并带有
(调用者(1))[3]
$ perl test.pl
1: My::Module::foo
2: My::Module::foo