- ベストアンサー
サブルーチンを変数を使って呼び出したい。
お世話になります。 Perlでサブルーチンを呼び出す場合、 &hogehoge; としますが、 このhogehogeの部分に変数を持っていきたいのですが、 やり方が分からず困っております。 試しに &{$hensu}; とやってみましたが、動きませんでした。 何かやり方はありますでしょうか。 解決策をご存じの方、ご教授よろしくお願いいたします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
サブルーチンへのリファレンスをハッシュに設定して、それをコールするのが素直と思われます。こんな感じ: use strict; sub hogehoge( $ ){ print 'msg: ', $_[0], "\n"; } my %Proc = ( 'hoge' => \&hogehoge ); my $call = 'hoge'; $Proc{ $call }->( 'test' );
その他の回答 (4)
- ___noboru___
- ベストアンサー率28% (33/117)
Linux マシンで(bashから)これ試してみたら無事 Hello が出ましたよ。 perl -Mstrict -e 'my $name = "mysub"; my $s = \&{$name}; &$s("Hello"); sub mysub {print "$_[0]\n"}' Perl のバージョンは v5.8.6 です。あと先にも書いた方法ですが、 eval 使ってもできましたよ。 perl -Mstrict -e 'my $name = "mysub"; eval qq(&$name("Hello")); sub mysub {print "$_[0]\n"}' これはどちらも strict です。エラーは一切出ません。
お礼
遅くなり申し訳ありません。 参考になりました。 ありがとうございます。
- hara_peko
- ベストアンサー率28% (11/38)
{ no strict "refs"; #必要な処理 } ・・・と、ブロックで囲んで必要な部分のみ無効にしてしまうとか。
- ___noboru___
- ベストアンサー率28% (33/117)
現在 Perl 5.8.6 で試してみましたが、&{$hensu} の方法で呼び出せました。&{$hensu}() も同じです。 これがだめなら eval を使えばいいと思います。 例) $hensu = 'hogehoge'; eval "&$hensu;";
補足
ご回答ありがとうございます。 #1さんの補足に書きましたが、strictモードでの状況下でした。 失礼いたしました。
- galluda
- ベストアンサー率35% (440/1242)
がると申します。 Perlの5.6系ですと、 #!/usr/bin/perl -w sub foo { print "aaa \n"; } my $a = "foo"; &{$a}(); というプログラムでちゃんと起動するのですが。 このプログラムを実行されるとどんな感じになりますでしょう?
補足
ご回答ありがとうございます。 失礼いたしました。 strict モードでの状況で動かないようです。 strict なしで動かしてみたところ、動作しました。 strict の場合、 > Can't use string ("hogehoge") as a subroutine ref > while "strict refs" in use at index.cgi line 52. と出てしまい、サブルーチンが実行されません。 perlのバージョンは5.8.5です。 strictで同じようなことを行える方法はありませんでしょうか?
お礼
お礼が遅くなり申し訳ありません。 この方法を基にプログラミングできました。 誠に有り難うございました。