変数に格納されている関数を呼び出す正しい方法は何ですか?
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でコーディングし、オブジェクトとモジュールを破棄し、最後に間接参照構文について説明します。
理論的にはスタイル#1の方が速いと思いますが、実際の生活に深刻な影響を与えるとは思えません。
どちらの方法でも同じコードになるため、パフォーマンスに違いがあるのではないかと心から疑っています。
$ perl -MO=Deparse -e'&$f()'
&$f();
-e syntax OK
$ perl -MO=Deparse -e'$f->()'
&$f();
-e syntax OK