• ベストアンサー

サブルーチンを変数を使って呼び出したい。

お世話になります。 Perlでサブルーチンを呼び出す場合、 &hogehoge; としますが、 このhogehogeの部分に変数を持っていきたいのですが、 やり方が分からず困っております。 試しに &{$hensu}; とやってみましたが、動きませんでした。 何かやり方はありますでしょうか。 解決策をご存じの方、ご教授よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.3

サブルーチンへのリファレンスをハッシュに設定して、それをコールするのが素直と思われます。こんな感じ: use strict; sub hogehoge( $ ){ print 'msg: ', $_[0], "\n"; } my %Proc = ( 'hoge' => \&hogehoge ); my $call = 'hoge'; $Proc{ $call }->( 'test' );

2NN
質問者

お礼

お礼が遅くなり申し訳ありません。 この方法を基にプログラミングできました。 誠に有り難うございました。

その他の回答 (4)

回答No.5

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 です。エラーは一切出ません。

2NN
質問者

お礼

遅くなり申し訳ありません。 参考になりました。 ありがとうございます。

  • hara_peko
  • ベストアンサー率28% (11/38)
回答No.4

{ no strict "refs"; #必要な処理 } ・・・と、ブロックで囲んで必要な部分のみ無効にしてしまうとか。

回答No.2

現在 Perl 5.8.6 で試してみましたが、&{$hensu} の方法で呼び出せました。&{$hensu}() も同じです。 これがだめなら eval を使えばいいと思います。 例) $hensu = 'hogehoge'; eval "&$hensu;";

2NN
質問者

補足

ご回答ありがとうございます。 #1さんの補足に書きましたが、strictモードでの状況下でした。 失礼いたしました。

  • galluda
  • ベストアンサー率35% (440/1242)
回答No.1

がると申します。 Perlの5.6系ですと、 #!/usr/bin/perl -w sub foo { print "aaa \n"; } my $a = "foo"; &{$a}(); というプログラムでちゃんと起動するのですが。 このプログラムを実行されるとどんな感じになりますでしょう?

2NN
質問者

補足

ご回答ありがとうございます。 失礼いたしました。 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で同じようなことを行える方法はありませんでしょうか?

関連するQ&A

専門家に質問してみよう