0

调用存储在变量中的函数的正确方法是什么?

my $f = sub () { ... };
&$f();  # 1st
$f->(); # 2nd

两者似乎都有效,第一个可能在perl4.

但是,我想知道“官方perl5方式”是什么。

此外,是否有任何性能影响?

4

2 回答 2

6

两者都是正确的方式。Perl 并不是要强迫你使用任何特殊的风格。

风格#1&$f()

临:
  • 强调我们正在使用子程序
缺点:
  • 看起来像线路噪音
  • 覆盖函数模板
  • 对我来说似乎有点perl4 -ly
注意事项:

在 perl4 的黑暗时代,没有引用。可以通过传递变量名称来模拟引用(*shudder*)。这也适用于潜艇,所以这段代码运行:

sub f { (shift == 0) ? 1 : 0 }
$g = "f";
print &$g(1); # prints 0;
print &$g(0); # prints 1;

use strict 'refs'提防这种恐怖。

风格#2$f->()

临:
  • 强调我们正在处理一个参考
  • 看起来更干净
缺点:
  • 可能与对象和 hashref 混淆
注意事项:

与其他语法相同,因为它们在引擎盖下是相同的。但是解引用运算符并没有经常被滥用。

性能影响

让我们面对现实吧,如果我们只关注性能,我们就会编写汇编程序。如果你想优化 Perl,首先优化算法,然后在 C/XS 中编写所有代码,丢弃所有对象和模块,最后讨论解引用语法。

第一种风格在理论上更快,但我怀疑它会在现实生活中产生严重影响。

于 2012-08-20T15:23:58.980 回答
4

我真诚地怀疑性能是否存在任何差异,因为两种方法都会产生相同的代码:

$ perl -MO=Deparse -e'&$f()'
&$f();
-e syntax OK
$ perl -MO=Deparse -e'$f->()'
&$f();
-e syntax OK
于 2012-08-20T15:26:43.550 回答