如何通过符号表来访问子主::和子的名字在一个标量
假设我有一个功能foo
(或::foo
,或者main::foo
如果你喜欢),我定义如何通过符号表来访问子主::和子的名字在一个标量
use strict; my $sub_name = 'foo';
我想间接调用foo
,因为“名称存储在$sub_name
中的函数”。 (对于这个例子来说,假设调用应通过列表1, 2, 3
作为参数。)
我知道,有一种方法用符号表工作main::
直接,对待它就像一个散列做到这一点像数据结构一样。
这个符号表的咒语就是我要找的。
我以前做过很多次这样的事情,但我多年没有编写过Perl,而且我不再记住这个咒语。
(我更愿意这样做,而不必诉诸no strict
,但如果这是不可能根本不算什么。)
回答:
我会简单地用一个象征性的参考。
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->()
回答:
您可以使用can:
my $sub_name = 'foo'; my $coderef = main->can($sub_name);
$coderef->(@args);
正如其他人所说,你要注意,这也可以返回如“能方法“或”isa“。 另外,如果$sub_name
包含Some::Module::subname
,这也将被调用。
如果您不确定$sub_name
中有什么,您可能需要采取不同的方法。 只有当您控制了$sub_name
并且它只能包含预期值时,才能使用它。 (我认为这,这就是为什么我写这个答案。)
以上是 如何通过符号表来访问子主::和子的名字在一个标量 的全部内容, 来源链接: utcz.com/qa/258298.html