2011-02-04 20 views
7

私は、ユーザー定義変数に依存する関数を呼び出すことができるサブ関数への参照を含むハッシュを作成したいと考えています。Perlサブ関数のハッシュ

my %colors = (
    vim => setup_vim(), 
    emacs => setup_emacs(), 
) 

$colors{$editor}(arg1, arg2, arg3) 
setup_vim()setup_emacs()サブ機能は後で私のファイルで定義される

$editorユーザー定義変数(すなわちVIMやemacs)です。これは可能ですか?私はそれを働かせることができないか、または被験者に関する良い情報を見つけることができません。ありがとう。

(私はそれが動作スイッチとして、今実装されていますが、私は上記のようなハッシュは、それが簡単に私の既存のコードに新しいエントリを追加することになるだろうと思います注意してください)

答えて

16

ここでは、構文です。

my %colors = (
    vim => \&setup_vim, 
    emacs => \&setup_emacs, 
); 

$colors{$editor}(@args) 

あなたが実際に

my %colors = (
    vim => sub {...}, 
    emacs => sub {...}, 
); 

と直接関数を作成することができますし、閉鎖に精通しているならば、Perlはあなたが私に行うことができ、辞書的に宣言された変数のための完全なクロージャをサポートしています。

+0

お互いのおかげで、うまく動作しました。私は閉鎖が私はPerlをマスターすることによってPerlをマスターしているのか分かりません。そして、彼らは2-3章で離れています:) –

+0

Closureは他の種類のレキシカル変数でも動作します。私。 – tchrist

+0

@tchrist:はい、クロージャはすべてのレキシカル変数で動作します。しかし、人々がそれらを使用したいものは、明らかに我々の変数で起こらない。それでも私は自分の反応を更新しました。 – btilly

3

ハッシュに呼び出すサブルーチンへの参照を渡す必要があります。

は、ここに例です:\ & myFuncという付き

sub myFunc { 
    print join(' - ', @_); 
} 

my %hash = (key => \&myFunc); 
$hash{key}->(1,2,3); 

あなたは、機能の基準ウィッヒポイントを取得します。重要なのは、離れたままにすることです。まず、関数の戻り値への参照を渡します。

参照で関数を呼び出すときは、 - >演算子を使用して関数を参照する必要があります。

+0

"参照で関数を呼び出すときには、 - >演算子でderefenceする必要があります。 " False。 –

+0

@Chris:それはかつて真実でした。それは今ではありません。 – tchrist

+0

@tchrist - 真。私がPerlを学んだ(3年?)ので、それは真実ではありません。 –