• ベストアンサー

同パッケージ内の関数を呼び出すには

同パッケージ内の関数を呼び出すことができません。 以下のようなディレクトリ構成で試験しています。 ├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を呼び出すことができるのでしょうか?

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

  • ベストアンサー
  • zebedeer
  • ベストアンサー率66% (80/121)
回答No.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になります。 (実際は何らかの値を渡してると思うので、問題ないと思いますが)

Ramtieger
質問者

お礼

回答ありがとうございました。 下のレスの通りです。申し訳ございませんでした。 「関数が見つからない」というエラーメッセージに 惑わされていたようです。

その他の回答 (1)

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.1

return &extract(); のように、&をつけて呼び出してみてください。

Ramtieger
質問者

お礼

回答ありがとうございました。 実は、extractの「任意の処理」部分で コーディングミスがあり、閉じ括弧が多かったせいで エラーが出ていたようです。 せっかく回答して頂いたのに申し訳ありません。 でも、1つの対処法として参考になりました。