- ベストアンサー
同パッケージ内の関数を呼び出すには
同パッケージ内の関数を呼び出すことができません。 以下のようなディレクトリ構成で試験しています。 ├main.pl └Contents └news.pm <main.pl> ---------------- use Contents::news; print Contents::news->get($param); exit(0); <news.pm> ---------------- package Contents::news; sub get(@){ #任意の処理 return extract(); } sub extract(@){ #任意の処理 return $output; } 1; 上記の例で、main.plからContents::newsパッケージの get関数を呼び出すことはできるのですが、 そこから、extract関数を呼び出そうとすると 「Undefined subroutine &Contents::news::extract called at Contents/news.pm line xx.」 とエラーが出て落ちてしまいます。 どのようにすればextractを呼び出すことができるのでしょうか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
「普通は$this->extract ()って感じで呼び出すのでは?」とか、 「うちのperl v5.6.1では普通に動くけどなぁ」とか言うのは置いといて、 この場合、extractの頭に&をつけるほかに、getの前にextractを宣言しておく方法もあります。 こんな感じ <news.pm> ---------------- package Contents::news; sub extract (@); sub get(@){ #任意の処理 return extract(); } sub extract(@){ #任意の処理 return $output; } 1; もちろん宣言だけではなく、定義自体をしてしまってもOK (順番を変える) <news.pm> ---------------- package Contents::news; sub extract(@){ #任意の処理 return $output; } sub get(@){ #任意の処理 return extract(); } 1; ただ、上記のコードの場合、extract(@)で値が渡されることを宣言しているので、extract()の呼び方ではPrototype mismatchになります。 (実際は何らかの値を渡してると思うので、問題ないと思いますが)
その他の回答 (1)
- tatsu99
- ベストアンサー率52% (391/751)
return &extract(); のように、&をつけて呼び出してみてください。
お礼
回答ありがとうございました。 実は、extractの「任意の処理」部分で コーディングミスがあり、閉じ括弧が多かったせいで エラーが出ていたようです。 せっかく回答して頂いたのに申し訳ありません。 でも、1つの対処法として参考になりました。
お礼
回答ありがとうございました。 下のレスの通りです。申し訳ございませんでした。 「関数が見つからない」というエラーメッセージに 惑わされていたようです。