電子書籍の厳選無料作品が豊富!

同パッケージ内の関数を呼び出すことができません。
以下のようなディレクトリ構成で試験しています。

├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を呼び出すことができるのでしょうか?

A 回答 (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になります。
(実際は何らかの値を渡してると思うので、問題ないと思いますが)
    • good
    • 0
この回答へのお礼

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

お礼日時:2004/05/15 21:57

return &extract();


のように、&をつけて呼び出してみてください。
    • good
    • 0
この回答へのお礼

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

お礼日時:2004/05/15 21:55

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!