调用Perl方法

3
这是正确的:
A::B->new();

这不行:
my $m = 'A::B->new';
&{\&{$m}};

如何让它工作?奇怪的语法对于不包含“->”的常规函数确实有效。


1
你也不应该使用那种“奇怪的语法”来调用常规子例程的名称... 如果 $f 是函数名,那么 $f->() 就可以工作,或者是旧的 &$f()。请注意,这两个都是 strict 'refs' 违规。 - hobbs
@Hobbs,&{\&{$f}}和更有用的&{\&{$f}}(),也就是(\&$f)->(),虽然在理论上应该是严重违规的,但实际上并没有抛出异常。这只是一个小漏洞。 - ikegami
@ikegami 当然可以,但如果你要绕过安全性,那么写在一个代码块中 no strict 'refs' 也没什么区别 :) - hobbs
@hobbs,是的,出于自我文档化的原因,如果没有其他原因的话。 - ikegami
1个回答

4
听起来您想要的是:
my $pkg = 'A::B';
my $method = 'new';

$pkg->$method;

太简单了。该死。 - Johannes Ernst
奖励问题:为什么 'A::B'->'new' 不起作用? - Johannes Ernst
为什么要这样做呢?没有理由,就像没有理由支持 'print'("abc\n"); - ikegami
2
你可以引用左侧的内容('A::B'->$method 将会生效),但右侧的内容必须是一个标量或者裸方法名。(有趣的是,右侧也可以是一个 CODE 引用。试一下吧。)这实际上在 perlop 中有简要说明。 - friedo
1
那是因为${...}会生成一个标量。 :) - friedo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接