调用存储在变量中的函数的正确方法是什么?
my $f = sub () { ... };
&$f(); # 1st
$f->(); # 2nd
两者似乎都有效,第一个可能在perl4
中工作。
但是,我想知道“官方perl5
方式”是什么。
此外,是否有任何性能影响?
答案 0 :(得分:6)
两者都是正确的方式。 Perl并不是强迫你的喉咙有任何特殊的风格。
&$f()
在perl4的黑暗时代,没有参考。可以通过传递变量名称(* shudder *)来模拟引用。这也适用于subs,所以这段代码运行:
sub f { (shift == 0) ? 1 : 0 }
$g = "f";
print &$g(1); # prints 0;
print &$g(0); # prints 1;
请use strict 'refs'
防范这种恐怖。
$f->()
与其他语法相同,因为它们在引擎盖下是相同的。但是,取消引用运算符不会经常被滥用。
让我们面对现实,如果我们都是关于表现,我们会写汇编。如果你想优化Perl,首先优化算法,然后用C / XS编写所有代码,丢弃任何对象和模块,最后讨论解除引用语法。
我会猜测风格#1在理论上更快,但我怀疑它会对现实生活产生严重影响。
答案 1 :(得分:4)
我真诚地怀疑是否有任何差异表现,因为两种方法都会产生相同的代码:
$ perl -MO=Deparse -e'&$f()'
&$f();
-e syntax OK
$ perl -MO=Deparse -e'$f->()'
&$f();
-e syntax OK