• ベストアンサー

サブルーチンを認識しません。

perlプログラムで サブルーチンの中で、別のサブルーチンを呼び出していますが、 なぜか認識しません。 KCatchでは以下の表示をしています。 Catch: Mon Sep 22 07:56:36 2003 ------------------------------------------------- [regist.cgi:375:die] Undefined subroutine &main::lock called. > &lock; ------------------------------------------------- regist.cgi with Perl 5.00502 for freebsd サブルーチン名には頭に & を付けて呼び出しています。 サブルーチンは、スクリプトの最後にまとめてあります。 同じサブルーチンは、他のスクリプトでも利用していますが、 エラーは出ていないのですが。 何が原因か、わかりません。 関係ないかもしれませんが、プログラム最初の方でuse strict;の宣言をしています。 他のサブルーチンも認識しません。 KCacthの表示は同じ &main::サブルーチン名 called になっています。 よろしくお願いします。

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

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

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

下記前提でよいでしょうか。 &lock(); ・・・(lockを呼び出している箇所) sub lock    ・・・サブルーチン:lockの定義 { ・・・ } 上記は1つのソースファイル上にある。 とすると、考えられるのは、 1.undef (&lock); により未定義にしている。 2.__DATA__のあとにsub lockを定義している為、サブルーチンとして認識されない。(__END__も同様) です。上記の2点はOKでしょうか?

ctpsys
質問者

お礼

tatsu99さん  ご指摘ありがとうございます。 2.__DATA__のあとにsub lockを定義している為、でした。 perl初心者で__DATA__の使い方を知りませんでした。 無事解決しました。

その他の回答 (1)

回答No.2

これだけではなんとも言えません(^^; サブルーチンが定義されていないようにPerlには見えるということなのでしょうけれど。 まず、strict宣言についてですが、 一度はずして実行し、確認してみればいいかと思います。 (はずして動かなくなると言うことは普通ありませんから) 一瞬スペルミスの類かとも思いましたが、 前回の書き込みを見る限り他のルーチンも未定義になっているんですよね。 ・・となると関係なさそうです。 一番可能性が大きそうなのは、 &lockが、mainパッケージではなくて、 他のパッケージ中にあるという状況ですが・・ (サブルーチンは別ファイルのライブラリやモジュール内を呼び出しているのでしょうか?)

ctpsys
質問者

お礼

natsuki_tkさん ありがとうございます。 __DATA__の後にルーチンを呼び出しているのが、間違いだったようで、無事解決しました。 それとは別に、サブルーチンを別ファイルのライブラリやモジュール内で呼び出し方も、調べたいと思います。 ありがとうございました。

関連するQ&A

  • ***.cgi内のサブルーチンにアクセス

    とあるスクリプトを見ると、htmlページのボタンで***.cgi?サブルーチン名 へリンクさせるものがあって、特定のサブルーチンにアクセスするようになっているのですが、自作スクリプトでこのようなことを真似てもそのサブルーチンだけが呼び出されず、普通に***.cgiにアクセスした状態になります。過去の記事で***.cgi?変数名=***として、Perl側でifを使って操作させるというのを見つけましたがそれではなく、直接特定のファイルの特定のサブルーチンにアクセスしているようなのですが、どうすればできるのでしょうか?

  • サブルーチン Perl みたいに C言語 で使うには 

    いままで数年HPを運営していたためにCGIを開発する手段として、Perl言語を使用してきました。その後、あるきっかけでC言語をするようになり、理屈上PerlとC言語が似ていました。 いままで、Perlでは開発・デバッグ等を効率よくするためサブルーチンを他のファイルにパッケージファイルとして開発していました。非常に便利でこれがC言語でも同じく使えたらいいなとつくづく思っています。 Perl言語の例 main.cgi(本体のファイル) package.pl(パッケージファイル) 本体ほファイルで実行させ、実行の途中必要なサブルーチンをパッケージファイルから呼び出します。 呼び出すには、 %渡す値=&パッケージ名::サブルーチン名; 同じようにC言語でやるときはどのようにすればいいのでしょうか?

  • リファレンスをサブルーチンの戻り値にしてもOKですか?

    ■ サブルーチン内部で処理した結果を格納した、配列、ハッシュ、スカラーなどのデータを戻り値として利用する必要があります。その場合、どうするのが標準的なやり方でしょうか? ■ return (配列へのリファレンス, ハッシュへのリファレンス, スカラー); などとやってしまっても問題はないでしょうか? ■ 下のプログラムを試したところ、予想に反しちゃんと 「31415」と表示されました。 #!/usr/bin/perl -w sub subroutine{ my @a = (3, 1, 4, 1, 5); return \@a; } my $b = subroutine{}; print @$b; ■ サブルーチン内部で使用した変数へのリファレンスをサブルーチン 外で使っていいのだろうか? サブルーチンの処理が終了した時点でサブルーチン内部で使用した 変数はメモリーから消去されるのかと思ったものですから。

    • ベストアンサー
    • Perl
  • gfortranによるサブルーチンの実行

    初めて投稿させていただきます。 MacOS X 10.5上でgfortranを使用しているのですが、サブルーチンが実行できなくて困っています。メインプログラム(main.f90)とサブルーチン(fast.f90)を同一フォルダ内に置き、ターミナル上でコマンド $ gfortran main.f90 によってコンパイルを実行したところ、 Undefined symbols: "_fast_", referenced from: _MAIN__ in ccz2x6RV.o _MAIN__ in ccz2x6RV.o ld: symbol(s) not found というメッセージが出てコンパイルが失敗してしまいます。サブルーチンが認識されていないということは分かるのですが、それ以上のことはさっぱり分かりません。ご助力願います。 なお、プログラムの内容は高速フーリエ変換です。また、サブルーチンを用いないプログラムに関しては既に正常に動作することを確認しています。

  • main::getのモジュール?

    Perl5.6(Win)を使っております。 Perlで過去にスクリプトを書いたのですが、 Undefined subroutine &main::get called at ./test.pl line 312. とエラーが出たので、 use LWP::Simple;かなと思い。モジュールを追加したのですが まだエラーが表示されます。 main::getと、名前空間まで同じになので、何か細工していたのかな と思っていましたが、思い出せません。 他にどんなモジュールがあるのでしょうか? また、現在インストールしているモジュールの一覧とかわかる方法はありますか?

    • ベストアンサー
    • Perl
  • perl use strict; と ファイルハンドルについて

    perl use strict; を使うと、単純なエラーが防げると認識していますが、下記スクリプトでは役に立たなかったようで、このエラーを探すのに苦労しました。 他にも、どこかのサブルーチンでsortを使ったスクリプト中で、$aを使った時もおかしな挙動をしたことがあります。 use strict;の使い方は正しいと思うのですが、エラーを出してはくれないものでしょうか? また、このようなエラーをしないために安全なプログラムの書き方はありますか? use strict; open(F,"<file.txt"); while(<F>){ &abc($_); } close(F); sub abc(){ my $str = shift @_; open(F,">>file2.txt"); print F $str; close(F); }

    • ベストアンサー
    • Perl
  • 文法はあってるのにサーバーエラーが出る

    perlで構文チェックをしたところ、OKが出たので、 アパッチにて実行したところサーバエラーがでました。 調べたところ、以下のようなエラーが出ましたが、これは、サブルーチンや、ライブラリが呼出されていないのでしょうか?どのように対処すればいいか教えてください。 Premature end of script headers: c:/www/public_html/subsub.cgi Undefined subroutine &jcode::convent called at c:\WWW\PUBLIC~1\SUBSUB.CGI line 8. Premature end of script headers: c:/www/public_html/okikae.cgi Can't locate cgi-bin.pl in @INC (@INC contains: C:/usr/local/lib C:/usr/local/site/lib .) at c:\WWW\PUBLIC~1\OKIKAE.CGI line 3.

    • 締切済み
    • CGI
  • デバッガでブレークポイントを削除できない

    今読んでる本、CGIプログラミング第2版ですが、いよいよ終盤です。 第15章 CGIアプリケーションのデバッグまで読み進めてきました。 Perlデバッガのコマンド表にあるコマンドを試しています。 b[ 行番号| サブルーチン名]コマンドでカレント行、指定行、指定サブルーチンへブレークポイントを設定できました。 今度は d[ 行番号| サブルーチン名]コマンドでブレークポイントを削除しようとしたのですが、削除できていませんでした。 何度試しても先ほど設定したブレークポイントで停止してしまいます。 さらに引数として行番号やサブルーチン名を与えたときは次のエラーが発生します。 Number found where operator expected at (eval 5)[/usr/lib/perl5/5.8.0/perl5db.pl:17] line 2, near "d 5" eval '($@, $!, $^E, $,, $/, $\\, $^W) = @saved;package main; $^D = $^D | $DB::db_stop; d 5; ;' called at /usr/lib/perl5/5.8.0/perl5db.pl line 17 DB::eval called at /usr/lib/perl5/5.8.0/perl5db.pl line 1323 DB::DB called at try line 4 (Do you need to predeclare d?) eval '($@, $!, $^E, $,, $/, $\\, $^W) = @saved;package main; $^D = $^D | $DB::db_stop; d 5; ;' called at /usr/lib/perl5/5.8.0/perl5db.pl line 17 DB::eval called at /usr/lib/perl5/5.8.0/perl5db.pl line 1323 DB::DB called at try line 4 syntax error at (eval 5)[/usr/lib/perl5/5.8.0/perl5db.pl:17] line 2, near "d 5" またDコマンドは全ブレークポイントを削除するそうですが、これも効きませんでした。 本件について、何か情報をお持ちの方、教えてくださいm(__)m

    • ベストアンサー
    • Perl
  • utf-8コードの指定

    以下のURLにて同じ質問をしました。 http://soudan1.biglobe.ne.jp/qa4938782.html その時は解決したと思ったのですが、私の勘違いでした。 Undefined subroutine &main::Jcode called at listpage.pl line 220, line 855. というエラーからして、 $value = Jcode($value)->utf8; という記述そのものの問題ではなく、jcode.pmが認識されていないということなのでしょう。 でもプログラムの最初には use Jcode; としてあるし、パスが通っていないことも考えて#!(何と呼ぶんだったっけ?)も #!/usr/bin/perl -I /usr/lib としました。perl.exeをd:\usr\bin/に置いて /usr/bin/perl で良いなら、jcode.pmはd:\usr/libにあるからパスはこれで良いですよね!? ちなみにこのディレクトリにはcgi.pmも置いていますが、cgi.pmは普通に動いてます。 何が問題だと考えられますか? お手数をお掛けします。

  • Do文で副プログラムの増やす【Fortran】

    Fortranを使用してます。 DO文で副プログラムをループさせて増やしたいのですが、どうすればいいか分りません。 具体的には、副プログラムの「SUBROUTINE」文+サブルーチン名 であるサブルーチン名の後にループを使って番号を付けたいのですが・・・ 簡易なイメージとして以下のソースでtest0、test1、test2、・・・・・test10となるようなサブルーチン名にしたいのです。 do x=0,10 SUBROUTINE test+x y=x+10 retun end end do Fortran初心者ですが、解決したいので難しい解説でも大丈夫です。 分る方は宜しくお願いいたします。