如何通过符号表来访问子主::和子的名字在一个标量

假设我有一个功能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

回到顶部