• 締切済み

メソッド名が変数のときの呼び方

perl 5.005のような古いperlですと、 my $hoge = Hoge->new; my $method = "speak"; $hoge->$method; とすると、構文エラーになるように思います。 どのように記述すればよろしいのでしょうか?

  • Perl
  • 回答数5
  • ありがとう数4

みんなの回答

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.5

普通はパッケージにあるメソッドは#3の方の例にあるように ハッシュを使ってそれ経由で呼び出すことがほとんどだと思うので、 どのようにpackage Hogeを作っているのか興味があるのですがそれは置いといて package Warage; sub new { my $self = shift; bless {}, $self; } sub hoge { my $self = shift; print "Warage::hoge called\n"; } sub fuga { my $self = shift; print "Warage::fuga called\n"; } sub foo { my $self = shift; print "Warage::foo called\n"; } sub bar { my $self = shift; print "Warage::bar called\n"; } 1; use strict; use warage; my $hoge = Warage->new; my $method1 = 'hoge'; $hoge->$method1(); my $method2 = 'fuga'; $hoge->$method2(); 実行結果: Warage::hoge called Warage::fuga called

panerai777
質問者

お礼

まさにこれでした! 気づいて締め切った後に・・・ sakusaker7さんありがとう!!!!!

  • maura
  • ベストアンサー率46% (48/104)
回答No.4

#3 記入ミスを訂正します。 &{$hoge->{method_speak}}; ---> &{$hoge->{$method}}; &{$hoge->{method_talk}}("abc"); ---> &{$hoge->{$method}}("abc");

  • maura
  • ベストアンサー率46% (48/104)
回答No.3

package hoge; sub new{ my $pkg = shift; my $hash= { method_speak => \&speak, method_talk => \&talk }; bless $hash,$pkg; } sub speak(){ print "speak\n"; } sub talk(){ $arg1 = shift; print "talk : $arg1 \n"; } package main; $hoge = new hoge; # 通常の呼び出し方 $hoge->speak; $method = "speak"; $method = "method_speak"; &{$hoge->{method_speak}}; $method = "method_talk"; &{$hoge->{method_talk}}("abc"); $local_method = "method_a"; print &$local_method; $local_method = "method_b"; print &$local_method; sub method_a(){ return "a\n"; } sub method_b(){ return "b\n"; }

panerai777
質問者

お礼

sakusaker7さんありがとうございます。 3項演算子で書きましたが、実は$methodには2つとは限りません。 ですので、 $hoge->{method_speak}としてる段階でアウトなのです。 長文書いて頂いたのにもうしわけないです。 後に、自己解決しました。 $hoge->$method(); でいいみたいです。 なんじゃそりゃって感じなんですけど、5.005とかだと上記のようにしないと動かないんです・・・ # OKwave今日はじめて利用させていただたいのですが、 # 自己解決したことって書けないのですね・・・

noname#25358
noname#25358
回答No.2

 $hoge::method = "speak";  これは駄目でしたっけ。

panerai777
質問者

お礼

早速のご返答ありがとうございます。 が、あえて変数にしたいのです。 my $method = ( $type == 1 ) ? "speak" : "talk"; みたいな感じで。

  • moon_night
  • ベストアンサー率32% (598/1831)
回答No.1

my $hoge = 'speak';

panerai777
質問者

お礼

ダブルクォートでもシングルクォートでもだめなはずです。 実際ダメでした。

関連するQ&A

  • use スカラー変数とするには・・・

    初心者PERLプログラマーです。 独学で身の回りにPERL仲間がいないため、質問させてください。 スカラー変数を使用してモジュールをuseしたいのですが、どうしてもできません。調べてみましたが検索力の無さからか見つからず… 現在のコードをはしょって書きます ----------------------- my $a = "Hoge"; use $a; my $b = new $a(); $b->run; ----------------------- $aの部分を変数にせず、use Hoge;と書くとうごくので、変数にしたことによるエラーだと思います。 $aを"$a"としてみたりしてもダメでした。 わかるかたご教授いただければ幸いです。

    • ベストアンサー
    • Perl
  • リフレクション 可変長引数メソッドの取得

    リフレクションで、(1)の方のメソッドインスタンスを得たいとき、どういった方法が考えられますか? //JDK 6.0 public Hoge { void method1(String str, Object ...objs){}//(1) void method1(String str, String str2){}//(2) } Hoge hoge = new Hoge(); Class c = hoge.getClass(); Method m12 = c.getMethod("method", String.class, String.class); Method m11 = c.getMethod("method", ?? );

    • ベストアンサー
    • Java
  • VB6で最後に$が付く変数名に付いて

    VB6で質問です。 変数名の宣言で以下のように$が最後に付いた変数が宣言されているプログラムを 見ることになりました。 Dim x1$ ネットで調べたのですが、有効な情報がなく、ご存知の方がいましたら、 教えていただければと思います。 調べた限りでは以下のような動作をするため、 「何か意味があるのでは?」と考えているのですが、分からない状態です。 分かっている現象 Dim x1$ '←OKとなる Dim x1$ as Integer '←構文エラーとなる Dim x$1$ '←構文エラーとなる ほかにも同様に、変数名の後ろに付く文字として、 "%"もあるのですが、同様な状態です。 ご存知の方がいましたら、 教えていただければと思います。

  • Perlの書き方について

    perlを勉強していて、似たような配列やハッシュの場合でしたらなんとか解決出来たのですが、以下の場合が思うような結果が得られず困っているので、どなたか教えていただきたく質問しました。 例) my $hoge1=10; my $hoge2=9; my $hoge3=8; my $hoge4=7; my $hoge5=6; my $hogehoge; for(1..5){ $hogehoge+=$hoge$_; } 上記の書き方の場合、「$hoge$_」でエラーが出ます。 このような場合は、どのように書けばいいのでしょうか。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • TwitterAPI1.1でGetメソッド(?)の

    perlでフォロワー一覧を取りたいのですがよくわからず困っています。 こちら、 http://pplace.jp/2012/10/1058/ 参考にしてやろうとしているのですが、 使えなくなったとされる1が使えて、1.1のほうがむしろエラーになります。 http://api.twitter.com/1/statuses/followers/TwitterのID.xml → これはOK http://api.twitter.com/1.1/friends/ids.json?screen_name=TwitterのID → エラーになる {"errors":[{"message":"Bad Authentication data","code":215}]} どうやらOauthの失敗とのことですが、、、 簡単なサンプルは動きました。 ---- こちらは確認 つぶやきサンプルです ------------- use strict; use Net::Twitter; my $consumer_key = '' my $consumer_secret = ''; my $token = ''; my $token_secret = ''; my $nt = Net::Twitter->new( traits => [qw/OAuth API::REST/], consumer_key => $consumer_key, consumer_secret => $consumer_secret, access_token => $token, access_token_secret => $token_secret, ); my $result = $nt->update('Hello World'); ----------------------------------------------------- しかし、 そもそも上のようなURL(GETメソッド?)をどうやってOAuthで呼び出すのかがわかりません・・・ perldoc Net::Twitter も見たのですが、それっぽい記述はありませんでした・・・ perlでTwitter1.1のAPIのGetメソッド(?)はどうやって呼び出すのでしょうか・・・

    • ベストアンサー
    • Perl
  • Perlのmyのサブルーチンの内外での宣言の違い

    Perlでmyを使う場合、サブルーチンの内外での宣言の違いについて知りたいです。 私はよくある変数をそのプログラム内全体で使う時(カウントするだけの$iみたいなものや、DBのクエリなど)は、同じ変数名をサブルーチン内で毎回宣言するのが嫌(個人的に同じことを重複するプログラムが好きではないという主義)なので、サブルーチンの外でmyを宣言するのですが、myとかはサブルーチン外で宣言するとどんな問題が生じる可能性があるのでしょうか? また毎回サブルーチン内で宣言するのと外部で宣言するのではどういった時に問題になるのでしょうか?もちろんサブルーチンの外でmy宣言した場合はサブルーチンにその変数が引き継がれることは知っています。 リファレンス部分で変わるような記述を見たことはあります。 さしあたって問題を感じでいないのです、ふと疑問に思ったのですが、どうもそれに書かれたソースが少ないので御存知の方がいればぜひ御教授願いたいです。 <例> my $hoge; sub hoge1 { $hoge = 1; } sub hoge2 { $hoge = 5; } と sub hoge1 { my $hoge = 1; } sub hoge2 { my $hoge = 5; }

    • ベストアンサー
    • Perl
  • TypeError: Object #has no

    ・TypeError: Object # has no method エラーになります ・なぜでしょうか? ・動くコードを知りたい、というより、なんでこれで駄目なのか教えてください function Hoge(area) {}; Hoge.getArea = function() { alert('こんにちは' + area); } var hoge = new Hoge('東京'); hoge.getArea(); TypeError: Object #<Hoge> has no method 'getArea'

  • perl cgiの局所変数について

    現在perlを使ってcgiのプログラムを組んでいるのですが、初歩的なことがよくわかっておらず、難儀しております。 調べてみたのですが中々理解できず困っているので助けてほしいです。 全てを書くと長くなってしまうので端折って書かせていただきます。 現在、局所変数のエラーで詰まっております。 送信プログラムのGETを使用していたのですが、セキュリティ的に危険ということがわかりまして、 POSTを使うように変更しました。 しかし、エラーが発生し、進まなくなってしまいました。 use strictを記述した後にエラーが発生し、原因を調べたところ、大域変数の使用を禁止してしまうという効果があることがわかりました。 検索して調べて出てきた対策として、全ての変数を定義して、myを記述すれば解決できるとあったので、myを記述してみたところ、エラーが発生してしまいました。 Can't declare null operation in my at ****.cgi line 38, near "tr/+/ /;" Execution of /virtual/www/****.cgi aborted due to compilation errors. というエラーが取れないです。 @array2 =~ tr/+/ /; という記述に問題があるらしいということしかわからないのですが、よくわかりません。 すみませんが、教えて頂きたいです。

    • ベストアンサー
    • CGI
  • ruby undefined method

    class Hoge def body "aaa" end end def up(arg) arg.upcase end res=Hoge.new res.body = up(res.body) puts res.body 上記を実行すると、undefined method `body=' for #<Hoge:0x2b36454> (NoMethodError) になります。 最後の2行を以下のように変えるとうまく動作します。 tmp=res.body tmp = up(tmp) puts tmp この理由が理解できません。 説明して頂けませんか?

  • 可変変数にアロー演算子を使いたい

    例えば、 /** $hoge->appale1 は 10 $hoge->appale2 は 20 $hoge->appale3 は 30 */ このように定義されていたとします。 それを可変変数で for( $k=1; $k<=3; $k++ ){  $dynamicName = 'hoge->appele' . $k;  print "apple{$k}は" . $$dynamicName . 'です'; } のように出力したいのですが、アロー演算子を含んだ可変変数だと$hoge->apple1の数値を出力してくれません。 どのように記述すればいいでしょうか? また、可変変数で不可能であれば代案でも結構です。 お分かりになる方、ご回答お願いいたします。

    • ベストアンサー
    • PHP