• ベストアンサー

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

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

  • Perl
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
  • 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つの対処法として参考になりました。

関連するQ&A

  • packageの中からのrequireがうまくいかない

    .pmファイルの中でrequireして別の.plファイルの中の関数を呼びたいのですがうまくいきません。 下記の例でmain.plを実行すると Undefined subroutine &module1::module2::hyoji のようになってしまいます。 どのようにしたら動くでしょうか --main.pl-- use module1; testprint(); --module1.pm-- package module1; sub testprint{   require "module2.pl"   hyoji(); #エラー    module2::hyoji(); # エラー   module1::module2::hyoji(); #エラー }1; module2.pl package module2; sub hyoji{   print "ZZZ"; }1; --main2.pl-- ちなみにこれは動きます require "module2.pl"; module2::hyoji();

    • ベストアンサー
    • Perl
  • モジュールに定義した関数の実行

    sample.pmに定義したhello関数をmain.plから呼び出したいと思っています。(sample.pmとmain.plは同じディレクトリに存在)下記のように書いてみたのですが実行したところ以下のようなエラーが出てしまいました。これはどういう対応をすればよろしいのでしょうか? Can't locate sample.pm in @INC (you may need to install the sample module) (@INC contains: C:/Strawberry/perl/site/lib C:/Strawberry/perl/vendor/lib C:/Strawberry/perl/lib) at c:\Perl_prj\main.pl line 2. (main.pl) require 'sample.pm'; hello(); (sample.pm) sub hello { print 'hello'; } 1;

  • Perlで定義済みの関数名を使った場合の警告について

    新しいパッケージで、同じ名前の関数名を定義した場合 Subroutine tmpnam redefined at というメッセージが 表示されますが、もともと同名の関数名は定義してはいけないのでしょうか?できる(オブジェクト指向の考え)のでしたら、どのようにすれば、警告なしのスマートな記述になるのでしょうか? package NewPack; use POSIX; sub tmpnam{ my $fname = "new-file" . POSIX::tmpnam; return $fname; }

    • ベストアンサー
    • Perl
  • 関数の戻り値にその関数のポインタを返すには?

    関数ポインタの使い方について質問したいです. 関数で,自分自身のポインタを(void*)ではなく関数と同じ型のポインタで返すことは可能でしょうか? (自分自身の関数ポインタと同じ型??) fucn (){ return fucn; } int main(){ fucn()()()(); return 0; } このようにmain関数の中でfucn()()・・・ のように任意個の()を書いたりできないでしょうか?  詳しい方いたらよろしくお願いします.

  • main関数の戻り値について

    c言語において、main関数の戻り値は何を意味しているのですか。 また、void型にすれば、main関数の戻り値を書かなくても問題無いでしょうか。 また、関数はreturn文を書かなくても、最後まで処理を実行すると終了するらしいですが、void型にすれば、main関数でreturn文を書かなくても問題無いでしょうか。

  • fortran90 引数で渡された関数の呼び出し

    fortran90を始めて間もない者です。 メインプログラムより呼び出しているサブルーチンにユーザ関数を渡しています。 このサブルーチンを自前で作成するのが目的です。 引数で受け取った関数を、自前の別関数より呼び出すにはどうしたら良いでしょうか。 Cであれば関数のポインタをグローバルな変数にセットしてやれば可能だと思いますが・・・ !-------------------------------- subroutine sub(func1, a) real::a interface real function func1(x) real::x end function func1 real function func2(x) real x end function func2 end interface call sub2(func2, a) write(*,*) a return end subroutine sub !-------------------------------- real function func2(x) real::func2, x ! ここでfunc1を呼び出したい ! func2=func1(x) end function func2 !-------------------------------- subroutine sub2(funca, a) real::a interface real function funca(x) real::x end function funca end interface a=funca(10.) return end !-------------------------------- program main external func real a call sub(func, a) write(*,*) a end program !-------------------------------- function func(x) real func, x func=2.*x*x end function func

  • クラスの作り方

    Perl初心者です。双方向に値を取り出せる TwoWayMapクラスを作成し、以下の期待値を取得したいのですが、エラーが出てうまく実行できません。原因について、アドバイスをお願いいたします。 (エラーメッセージ) Can't locate object method "new" via package "TwoWayMap" at samplev2-2.pl line 6. (期待値) Apfel apple pear ---- TwoWayMap class :ファイル名 samplev2.pl ---------------- package TwoWayMap; $forward_hash={}; $reverse_hash={}; sub put{ $forward_hash{$_[0]}=$_[1]; $reverse_hash{$_[1]}=$_[0]; } sub get{ return $forward_hash{$_[0]}; } sub rev{ return $reverse_hash{$_[0]}; } ---- main ファイル名:samplev2-2.pl------------------------ package main; use TwoWayMap; our $e2g = new TwoWayMap; $e2g->put('apple', 'Apfel'); $e2g->put('pear', 'Birne'); print $e2g->get('apple'), "\n"; print $e2g->rev('Apfel'), "\n"; print $e2g->rev('Birne'), "\n";

    • ベストアンサー
    • Perl
  • C言語 main関数とsum関数の記述順について

    はじめまして。 【苦しんで覚えるC言語】(Web版)でC言語を学んでいる初学者です。 【第1部:C言語基礎編】>【関数の作り方】>【自作関数を作る】の部分(http://9cguide.appspot.com/11-01.html#S2)でつまづいています。 下記のような、1から100までの数字の合計を表示するプログラムが例題として取り上げられています。 しかし、ここが理解できないので、次の【プロトタイプ宣言】に進めずにいます。 例題1  sum関数をmain関数の後に記述した場合(プログラムが実行されない)。 #include <stdio.h> int main(void) { return 0; } int sum(void) { printf("%d\n",(1 + 100) * 100 / 2); return 0; } 例題2  sum関数をmain関数の先に記述した場合(プログラムが実行される)。 #include <stdio.h> int sum(void) { printf("%d\n",(1 + 100) * 100 / 2); return 0; } int main(void) { return 0; } 例題1の場合、【まずmain関数を作り、次にsum関数を作りました。この場合、main関数を解析している段階では、sum関数は発見されておらず、従って、main関数の中では、sum関数を使うことは出来なくなってしまいます。】との説明がありますが理解できません。 コンパイラがどのような順番でプログラムを処理しているか理解できていないので分からないのだと思います。 例題1の場合と例題2の場合の両方について、コンパイラがどのような順番でプログラムを処理しているのかを具体的に教えてください。 どうかよろしくお願い致します。

  • Perlで use strict して our変数

    Perl 初心者です。初めて質問します。 test_sub.pl で宣言した変数を test_main.pl から参照したくて悩んでいます。 環境 : WindowsXP / ActivePerl 5.14.2 -------------------- * test_sub.pl -------------------- #!/usr/bin/perl use strict; our $hoge = 'HOGE'; 1; -------------------- * test_main.pl -------------------- #!/usr/bin/perl use strict; require 'test_sub.pl'; print "Content-type: text/html\n\n"; print $hoge; -------------------- これを実行すると、 Global symbol "$hoge" requires explicit package name at C:/public_html/cgi-bin/test_main.pl line 7.\r というエラーが出ます。 require する前に、test_main.pl のほうで our($hoge); と宣言したり 参照する際に print $main::hoge; とパッケージを指定したりすればいけるのですが、 これらをしないとできないものなのでしょうか。 use strict; を書かなければ最初のソースでも動くのですが use strict は書きたい… 継承のようなことをしたいのです。 ちなみに以下試してみたソースです。 -------------------- * test_main.pl -------------------- #!/usr/bin/perl ######################################## # NG use strict; require 'test_sub.pl'; print "Content-type: text/html\n\n"; print $hoge; ######################################## # OK our変数を宣言しておくといける =pod use strict; our ($hoge); require 'test_sub.pl'; print "Content-type: text/html\n\n"; print $hoge; =cut ######################################## # OK 参照する際にパッケージ名を指定すればいける =pod use strict; require 'test_sub.pl'; print "Content-type: text/html\n\n"; print $main::hoge; =cut ######################################## ######################################## # NG =pod use strict; use base qw(test_sub); print "Content-type: text/html\n\n"; print $hoge; =cut ######################################## -------------------- * test_sub.pm -------------------- #!/usr/bin/perl package test_sub; use strict; our $hoge = 'HOGE'; 1; -------------------- NG パタンはどちらも Global symbol "$hoge" requires explicit package name のエラーとなります。 もしご存じの方がいらっしゃいましたら教えてください。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • 関数へのポインタで

    関数を場合によって使い分けたくて, 次のようにしています. double f1(double x) { return 3*x; } double f2(double x) { return 5*x; } double f3(double x) { return 10*x } /* 同じようにg1, g2, g3があります. */ 次のようなルーチンを使って, void sub(double (*F)(double), ...) { F(a); F(b); } int main() { double (*func_f[])(double)={f1, f2, f3}; double (*func_g[])(double)={g1, g2, g3}; sub(func_f[i], ...) } といった感じにしています. いま,f1*g2のような関数に対してsubを使いたいのですが,この場合はどのようにすればいいのでしょうか? (f1*g2)を一つの関数として扱えることができればいいと思うのですが,方法がわかりません. 教えて下さい. よろしくお願いします.

専門家に質問してみよう