假设我有一个功能foo
(或::foo
或main::foo
,如果您愿意),我定义
use strict;
my $sub_name = 'foo';
我想间接调用foo
,作为“名称存储在$sub_name
中的函数”。 (为了这个例子,假设调用应该将列表1, 2, 3
作为参数传递。)
我知道有一种方法可以直接使用main::
的符号表,将其视为类似哈希的数据结构。
这个符号表咒语是我正在寻找的。 p>
我以前做过很多次这样的事情,但是我多年没有编写过Perl编程,我不再记得这个咒语了。
(我更愿意这样做,而不必求助于no strict
,但如果不可能,那就没什么大不了的。)
答案 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
并且它只能包含预期值时才使用此选项。 (我认为这就是我写这个答案的原因。)