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->()

プロ:
  • 参照を処理していることを強調します
  • きれいに見えます
短所:
  • オブジェクトやハッシュ参照と混同される可能性があります
警告:

内部的には同じであるため、他の構文と同じです。ただし、間接参照演算子は頻繁に誤用されることはありません。

パフォーマンスへの影響

それに直面してみましょう。パフォーマンスがすべてだとしたら、アセンブラーを作成することになります。Perlを最適化する場合は、最初にアルゴリズムを最適化し、次にすべてをC / XSでコーディングし、オブジェクトとモジュールを破棄し、最後に間接参照構文について説明します。

理論的にはスタイル#1の方が速いと思いますが、実際の生活に深刻な影響を与えるとは思えません。

于 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 に答える