如何在标量变量中访问main ::和sub的子符号表

时间:2017-12-02 20:55:08

标签: perl syntax

假设我有一个功能foo(或::foomain::foo,如果您愿意),我定义

use strict;
my $sub_name = 'foo';

我想间接调用foo,作为“名称存储在$sub_name中的函数”。 (为了这个例子,假设调用应该将列表1, 2, 3作为参数传递。)

我知道有一种方法可以直接使用main::的符号表,将其视为类似哈希的数据结构。

这个符号表咒语是我正在寻找的。

我以前做过很多次这样的事情,但是我多年没有编写过Perl编程,我不再记得这个咒语了。

(我更愿意这样做,而不必求助于no strict,但如果不可能,那就没什么大不了的。)

2 个答案:

答案 0 :(得分:3)

我只是使用符号引用。

my $sub = \&$qualified_sub_name;    # \&$symbol is except from strict 'refs'.

$sub->()

但您要求我们避免使用符号引用。这太复杂了。 (它也可能不会处理奇怪但合法的滥用冒号。)

my $pkg = \%::;
my $sub_name = $qualified_sub_name;
$pkg = $pkg->{$1} while $sub_name =~ s/^(.*?::)//sg;
my $sub = $pkg->{$sub_name};
$sub = *{ $pkg->{$sub_name} }{CODE}
   if ref(\$sub) eq 'GLOB';  # Skip if glob optimized away.

$sub->()

答案 1 :(得分:1)

您可以使用can

my $sub_name = 'foo';
my $coderef = main->can($sub_name);
$coderef->(@args);

正如其他人所提到的那样,你应该注意到这也可以返回像" can"这样的方法。或" isa"。 另外,如果$sub_name包含Some::Module::subname,则也会调用它。

如果您不确定$sub_name中的内容,您可能需要采用不同的方法。 仅当您控制$sub_name并且它只能包含预期值时才使用此选项。 (我认为这就是我写这个答案的原因。)