调用存储在变量中的函数的正确方法是什么?
my $f = sub () { ... };
&$f(); # 1st
$f->(); # 2nd
两者似乎都有效,第一个可能在perl4
.
但是,我想知道“官方perl5
方式”是什么。
此外,是否有任何性能影响?
调用存储在变量中的函数的正确方法是什么?
my $f = sub () { ... };
&$f(); # 1st
$f->(); # 2nd
两者似乎都有效,第一个可能在perl4
.
但是,我想知道“官方perl5
方式”是什么。
此外,是否有任何性能影响?
两者都是正确的方式。Perl 并不是要强迫你使用任何特殊的风格。
&$f()
在 perl4 的黑暗时代,没有引用。可以通过传递变量名称来模拟引用(*shudder*)。这也适用于潜艇,所以这段代码运行:
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 中编写所有代码,丢弃所有对象和模块,最后讨论解引用语法。
我猜第一种风格在理论上更快,但我怀疑它会在现实生活中产生严重影响。
我真诚地怀疑性能是否存在任何差异,因为两种方法都会产生相同的代码:
$ perl -MO=Deparse -e'&$f()'
&$f();
-e syntax OK
$ perl -MO=Deparse -e'$f->()'
&$f();
-e syntax OK