CGI::Carpを使っているのにInternal Server Error

このQ&Aのポイント
  • CGI::Carpを使っているのにブラウザでInternal Server Errorが発生します。コマンドラインでは正常に動作します。
  • 原因は、プログラムの実行順序とHTMLのサポートの欠如です。
  • CGI::Carpが機能していないため、エラーメッセージが表示されず、問題解決が難しい状況です。
回答を見る
  • ベストアンサー

CGI::Carpを使っているのにInternal Server Error

うまく動きません。コマンドラインでは作動するのですが、ブラウザではダメでした。  #! /usr/bin/perl -w  use Calendar::Simple;  use CGI::Carp qw(fatalsToBrowser);  use Data::Dumper;  use lib "/home/kojima/kojima00001/myperl/lib";  my @curr=calendar;  print Dumper(@curr); もっともその理由は分かりました。  use lib "/home/kojima/kojima00001/myperl/lib"; が  use Calendar::Simple; より後にあったことです。 さらに言うと、ブラウザで動かすためにはHTMLをサポートしていないといけませんが、このコードはHTMLをサポートしていません。 この2点を修正して、無事このプログラムはブラウザでもうまく動いたのですが、問題はうまく動いてくれていなかった時のブラウザの表示です。 Internal Sever Errorが出ていました。それじゃ何のことか分からなくて嫌だから  use CGI::Carp qw(fatalsToBrowser); と宣言してあるのです。 モノの本によると、この場合は  Software error:  Can't locate Calendar/Simple.pm in @INC (@INC containts: @INCに含まれるディレクトリがズラズラ・・・).  BEGIN failed--compilation aborted at calendar.cgi line3. というエラーメッセージが表示されるはず。 つまりCGI::Carpが機能していないことになります。 何故でしょう? お手数をお掛けします。

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

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

  • ベストアンサー
回答No.1

 use Calendar::Simple;  use CGI::Carp qw(fatalsToBrowser); を  use CGI::Carp qw(fatalsToBrowser);  use Calendar::Simple; とすればどうか

makoji
質問者

お礼

凄い! これも順番だったんですね。 ありがとうございます!

関連するQ&A

  • コマンドラインで通っているパスがブラウザからだと通っていない

    以下のようなcgiを組みました。  #! /usr/bin/perl -w    use Calendar::Simple;  use CGI::Carp qw(fatalsToBrowser);  use Data::Dumper;  use lib "/home/makoji/makoji00001/myperl/lib";    my @curr=calendar;  print Dumper(@curr); レンタルサーバー上のこのCGIをSSHで  perl calendar.cgi とやるときちんと作動します。 しかしながらブラウザから作動すると500 Internal Sever Errorが出ます。 エラーログを見ると、以下のようになっています。 [Fri Jun 12 23:53:51 2009] [error] [client 114.162.47.49] Can't locate Calendar/Simple.pm in @INC (@INC contains: /usr/lib/perl5/5.8.8/i686-linux /usr/lib/perl5/5.8.8 /usr/lib/perl5/site_perl/5.8.8/i686-linux /usr/lib/perl5/site_perl/5.8.8 /usr/lib/perl5/site_perl/5.8.7 /usr/lib/perl5/site_perl/5.8.6 /usr/lib/perl5/site_perl/5.8.5 /usr/lib/perl5/site_perl .) at /home/makoji/makoji00001/www/calendar.cgi line 3. [Fri Jun 12 23:53:51 2009] [error] [client 114.162.47.49] BEGIN failed--compilation aborted at /home/makoji/makoji00001/www/calendar.cgi line 3. [Fri Jun 12 23:53:51 2009] [error] [client 114.162.47.49] Premature end of script headers: calendar.cgi Calendar/Simple.pmが@INCの中に無いとエラーが出ています。3行目でコンパイルに失敗したのもやはりCalendar/Simple.pmです。 @INCにCalendar/Simple.pmのパスを通すためにcgi頭で  use lib "/home/makoji/makoji00001/myperl/lib"; を宣言しているわけです。 で、SSHを用いてコマンドラインから実行すると作動します。 なのに、何でブラウザからだと500 Internal Server Errorが出るのでしょう。 そもそも  use CGI::Carp qw(fatalsToBrowser); と宣言しているのに500 Internal Server Errorが出るというのも可笑しな話です。 何に問題があるのでしょうか。 ちなみに.bashrcは以下のようになっています。  # .bashrc    # Source global definitions  if [ -f /etc/bashrc ]; then   . /etc/bashrc  fi    # User specific aliases and functions  export MANPATH=/home/makoji/makoji00001/myperl/man  export PERL5LIB=/home/makoji/makoji00001/myperl/lib お手数をお掛けします。

  • use CGI

    サンプルスクリプトのなかに use CGI qw(:cgi :form); use CGI::Carp qw(fatalsToBrowser); use Image::Magick; と書かれていたのですがuse CGI::Carp qw(fatalsToBrowser);は意味わかったのでコメントアウトしましたがuse CGI qw(:cgi :form);は何を読み込んでいるのですか?コメントアウトしても大丈夫でしょうか? イメージマジックは使うのでそのままにしてあります よろしくお願いします

    • ベストアンサー
    • Perl
  • エラー画面の制御?

    Perl5.6のActivePerlを使っています。 $SIG{__DIE__} = \&error_gamen; でエラーを飛ぶようにしましたが、画像送信した際に 指定したサイズ以上の写真を送信した場合に cgi-lib.pl: Request to receive too much data: 1878024 bytes が表示されるのですが、 use CGI::Carp qw(fatalsToBrowser warningsToBrowser); を書くとそうなるものでしょうか? sub error_gamenで作成したデータのみ表示させたいです。 sub error_gamen{ print <<EOT; Content-type: text/plain エラーです。 EOT }

    • ベストアンサー
    • Perl
  • パスがうまく通らない

    Check.pmが  o:\public_html/post_pervice/cgi/lib にあります。 このモジュールを利用するために以下のようなプログラムを書きました。   #! /usr/bin/perl -w   use CGI::Carp qw(fatalsToBrowser);   unshift @INC, "o:/public_html/post_service/cgi/lib";   print join "\n",@INC;   use Check; この中の  use Check; をコメントで伏せて動かすと、   o:/public_html/post_service/cgi/lib   O:/usr/site/lib   O:/usr/lib のような表示がなされるので、  unshift @INC, "o:/public_html/post_service/cgi/lib"; はちゃんと機能しているようです。 しかし  use Check; のコメントを外して動かすと、   Can't locate Check.pm in @INC (@INC contains: O:/usr/site/lib O:/usr/lib .) at O:\public_html\post_service\cgi\showINC.pl line 8.   BEGIN failed--compilation aborted at O:\public_html\post_service\cgi\showINC.pl line 8. のようなエラーが出てしまいます。 何がいけないのでしょう。

    • ベストアンサー
    • Perl
  • 一括してモジュールを読み込みたい

    最近Perlを始めました。(今まではPHPをやっておりました) 利用するモジュールを各CGIファイルごとの先頭に宣言するのが面倒なので、Include.plなどのファイルを作って一括して読み込みたいと考えています。 例えば以下のような感じです。 【Include.pl】 use strict; use Data::Dumper; use Fcntl qw(:DEFAULT :flock); use CGI; use CGI::Session ; use CGI::Carp qw(fatalsToBrowser); use Encode; use HTML::Template; 1; 上記のようなファイルを各CGIファイルの先頭で、 require 'include.pl'; とした場合に、使用できないモジュールがあります。 例えば、ファイルロックをしたくてflock(FILE, LOCK_EX)とするとエラーになってしまいます。 しかし、CGIモジュールは$q = CGI->new()と普通に利用できます。 モジュールは全てインストールされています。その証拠にCGIファイルに直接useの宣言を書けば動作します。 通常、このような使い方でモジュールのuseは有効にならないのでしょうか?? また、自分で作成したモジュール内で他のモジュールを利用したいといった場合、いちいちuseで宣言しなければならないのでしょうか。 mainとなるファイルでuse宣言しておくだけで、自作モジュール内で利用できると思ったのですが、いちいち宣言しなおさなければ利用できないようです。 挙動がPHPと違うため困惑しております。 どなたかご教授いただけないでしょうか。よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • PerlのCGIでフォームのテキスト配列をPerlで取得するには?

    フォームで通常は同じ名前のデータを取得することは無いのですが 表計算のように同じ名前の場合、データの取り出し方がわかりません。 以下、通常の1件の場合のソースです。 #!/usr/bin/perl $| = 1; use strict; our %in; use CGI::Carp qw(fatalsToBrowser); use CGI qw(:standard); require 'jcode.pl'; require 'cgi-lib.pl'; # #-----分岐----- &ReadParse; # 配列でない場合 my $namae = $in{'namae'} print "$namaeで名前が1件表示される"; # これをフォームで namaeが配列になった場合、 #<input type="text" name ="namae"> #<input type="text" name ="namae"> #<input type="text" name ="namae"> # のような場合、3件取得する場合 exit; __END__

    • ベストアンサー
    • CGI
  • POST形式でファイルを送ると、CGIモジュールでエラーが出ます。

    ファイルを添付できるメールフォームを作ろうと思いました。 まず呼び出し側のHTMLファイルを以下のようにしました。   <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">   <html>   <head>    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">   </head>   <body>   <form action="./filemail.cgi" method="post" enctype="multipart/form-data">    <input type="file" name="file-1"><br />    <input name="submit" type="submit" value="送信">   </form>   </body>   </html> しかし受け手のCGIの方でエラーが出ます。 エラー原因を調べるためプログラムのコードをとことんまで削りました。   #! usr/bin/perl -d      use strict;   use warnings;   use CGI::Carp qw(fatalsToBrowser);   use CGI;      our $q=new CGI; ・・・A      print $q->header(-charset=>'utf-8'),      $q->start_html(-charset=>'utf-8',             -lang=>'ja-JP'),      "うまくいった~~^^v\n",      $q->end_html; それでもエラーが出ます。エラー箇所はAの our $q=new CGI; です。 エラーメッセージは   Software error:   CGI open of tmpfile: No such file or directory です。 ちなみにコードを削りまくったこのプログラムはフォームデータとまるで関係ないので、ブラウザのURL窓にURLを手入力して呼び出してみました。  http://127.0.0.1//filemail.cgi これは目出度く正常に動作します。  うまくいった~~^^v またファイルを添付せずにフォームの送信ボタンをクリックしても正常に動作します。 そしてファイルを添付しても、フォームの送信方法をPOSTではなく、GETにしたら正常に動作します。 要するに、フォームの送信方法がPOSTの場合に、ファイルを添付して送信ボタンをクリックすると前述のエラーが出ます。 エラーメッセージからしてCGIモジュールで何か問題が起きているのですが、CGIモジュールとPOSTによるファイル送信は相性が良くないのでしょうか。それとも何か他にやるべきことがあるのでしょうか。 お手数をお掛けします。

    • ベストアンサー
    • Perl
  • Perlで作成したCGIについて

    Perlで作成したCGIについて Perlで作成したCGIについて質問させていただきます。 #################### ##(1)system.cgi ## #################### #!c:/Perl/bin/perl.exe use strict; use warnings; use CGI; use CGI::Carp('fatalsToBrowser'); use CGI qw(:standard); print "Content-type:text/html;charset=utf8\n\n"; system('C:\\test.txt'); ##################################################### C直下にあるtest.txtの中身は「abcd」など 簡単なものです。 ##################################################### ################### ##(2)win32.cgi ## ################### #!c:/Perl/bin/perl.exe use strict; use warnings; use CGI; use CGI::Carp('fatalsToBrowser'); use CGI qw(:standard); use Win32::API; print "Content-type:text/html;charset=utf8\n\n"; my $MessageBox = Win::API -> new("user32","MessageBoxA","NPPN","N"); $MessageBox -> Call(0,"HelloWorld","Message",0); ##################################################### ##################################################### 以下にスペックを書きます。 Microsoft Windows XP Professional version2002 Service Pack2 Genuine Intel(R)CPU L2300 @1.50GHz 1.50GHz,1.49GB RAM ・ActivePerl ver5.10.1 built for MSWin32-x86-multi-thread ・Apache Apache 2.2.14(Win32) ##################################################### 上記の(1)、(2)のプログラムをエクスプローラ上(ローカル)で実行させて(1)ではテキストファイルを、 (2)ではメッセージボックスを表示させたいです。 結果は時間がかかるだけでTimeOutの設定である5分で切れてしまい何も起こりません。 しかし、全く同じプログラムで拡張子を.plに変更してコマンドプロンプトで実行すると、 期待通り(1)はテキストファイルが開かれ、(2)ではメッセージボックスが出てきます。 (1)、(2)ともCGIではsystemおよびMessageBoxの部分をコメントアウトして print文などを書けば普通にエクスプローラに表示されます。 (かなりhtmlとしては不備があると思いますが・・・) どうすればCGIで(1)、(2)のプログラムが期待通りの動きをするのか どうぞご教授のほどよろしくお願いいたします。 何か足りない情報や意味の分かりづらい個所がありましたら、仰ってください。 ちなみにこのプログラムは公開するために作成しているのではありません。 下手な説明、長文すみません。

  • opendir apache 絶対url

    apache上でcgi-bin/ファイル.cgiのファイル.cgiから特定のディレクトリハンドルを開くために #!/perl/perl/bin/perl -wT use strict; use CGI::Carp qw(fatalsToBrowser); opendir DH, "http://localhost/image/"; opendir DH, "http://localhost/image/" or die "error"; for (readdir DH){ print; } としたのですが オープンできません opendirのパスに絶対urlや相対urlを使用する方法はありませんか?

  • CGIモジュールを使いたいのですがエラーがでます。

    use CGI qw(standard); if(!open(TOP,"$TOP_HTML")){&error('トップページデーターファイル読み取りエラー。'); } else{ @topdata=<TOP>; close(TOP); } ・・・ ================================ 上のような例があるとして実行可能な状態になっています。 そこに $year = param('year'); $mon = param('mon'); というparam関数をいれるとインターネットサーバーエラーになります。 モジュールをいままでつかったことがなく簡単に使えそうだと思い試したところいきなりエラー。 エラーログを調べたところ Undefined subroutine &main::param called at C:/sample.cgi line 9. となります。line 9は$year = param('year');の行です。なにがいけないのでしょうか?

    • ベストアンサー
    • CGI

専門家に質問してみよう