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

时间:2012-08-20 15:13:43

标签: perl

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

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

两者似乎都有效,第一个可能在perl4中工作。

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

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

2 个答案:

答案 0 :(得分:6)

两者都是正确的方式。 Perl并不是强迫你的喉咙有任何特殊的风格。

样式#1 &$f()

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

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

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

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

样式#2 $f->()

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

与其他语法相同,因为它们在引擎盖下是相同的。但是,取消引用运算符不会经常被滥用。

性能影响

让我们面对现实,如果我们都是关于表现,我们会写汇编。如果你想优化Perl,首先优化算法,然后用C / XS编写所有代码,丢弃任何对象和模块,最后讨论解除引用语法。

我会猜测风格#1在理论上更快,但我怀疑它会对现实生活产生严重影响。

答案 1 :(得分:4)

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

$ perl -MO=Deparse -e'&$f()'
&$f();
-e syntax OK
$ perl -MO=Deparse -e'$f->()'
&$f();
-e syntax OK