dポイントプレゼントキャンペーン実施中!

いくつも条件分岐があり、配列?テーブル?か何かに
登録しておいて、対応づけにより、C言語の関数ポイン
タのように処理をしたいのですが、どう記述すれば
いいのでしょうか。

例えば、変数$stool が”kitte”の場合は、関数
func_kitte()を呼び、変数$stool が"hagaki"の場合
関数func_hagaki()を呼び出したいのです。

この条件が300個以上あり、全部if~elsif文で
記述するより、配列か何かに登録する方が効率的だと
思ったからです。よろしくお願いします。

A 回答 (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";
}
    • good
    • 0
この回答へのお礼

関数のハッシュはやったことがなかったので
実現してみます。
どうもありがとうございました。

お礼日時:2006/10/02 22:11

型グロブを介して、サブルーチンを呼び出せるかもしれません。



use strict;
my $stool = "kitte";

{
no strict 'refs';
&{*{"func_$stool"}{CODE}};
}

sub func_kitte { print "kitte\n"; }
sub func_hagaki { print "hagaki\n"; }
    • good
    • 0
この回答へのお礼

いろいろ技があるんですね。
回答どうもありがとうございました。

お礼日時:2006/10/02 22:12

evalが使えるかと思います



@functions=("test1","test2","test3");
foreach (@functions){
eval $_;
}
sub test1{print "test1\n";}
sub test2{print "test2\n";}
sub test3{print "test3\n";}
    • good
    • 0
この回答へのお礼

回答ありがとうございました。
eval使用して見ます。

お礼日時:2006/10/02 22:10

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!