- ベストアンサー
C言語の関数ポインタのイメージで処理させるには?
いくつも条件分岐があり、配列?テーブル?か何かに 登録しておいて、対応づけにより、C言語の関数ポイン タのように処理をしたいのですが、どう記述すれば いいのでしょうか。 例えば、変数$stool が”kitte”の場合は、関数 func_kitte()を呼び、変数$stool が"hagaki"の場合 関数func_hagaki()を呼び出したいのです。 この条件が300個以上あり、全部if~elsif文で 記述するより、配列か何かに登録する方が効率的だと 思ったからです。よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
関数もリファレンスを配列やハッシュに保存できたりします。 リファレンス化した関数をコールするにはリファレンスの先頭に"&"をつけます。 以下サンプルソース。 --------------------------------------------------------------- # 関数をハッシュに登録する my %funcHash = ( kitte => \&func_kitte, hagaki => \&func_hagaki, ); # テストスクリプト my @val = ('kitte','hagaki'); foreach my $stool (@val){ &{$funcHash{$stool}}; } sub func_kitte{ print "kitte\n"; } sub func_hagaki{ print "hagaki\n"; }
その他の回答 (2)
- kumoz
- ベストアンサー率64% (120/185)
型グロブを介して、サブルーチンを呼び出せるかもしれません。 use strict; my $stool = "kitte"; { no strict 'refs'; &{*{"func_$stool"}{CODE}}; } sub func_kitte { print "kitte\n"; } sub func_hagaki { print "hagaki\n"; }
お礼
いろいろ技があるんですね。 回答どうもありがとうございました。
- pipipi523
- ベストアンサー率40% (148/365)
evalが使えるかと思います @functions=("test1","test2","test3"); foreach (@functions){ eval $_; } sub test1{print "test1\n";} sub test2{print "test2\n";} sub test3{print "test3\n";}
お礼
回答ありがとうございました。 eval使用して見ます。
お礼
関数のハッシュはやったことがなかったので 実現してみます。 どうもありがとうございました。