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.

このQ&Aに関連する最新のQ&A

A 回答 (4件)

CGIプログラムはcgi-binの下になければならない、とは限りません。

Apacheの設定によります。
「Can't locate ...」などはまぎれもなくPerlが出しているエラーメッセージ
でしょう。ですから、サーバはCGIとして実行しようとはしていると思われ
ます。
koujinさんもうすうすお分かりのように、jcode.plやcgi-bin.plがみつから
ないんですね。それらのファイルがカレントディレクトリもしくは
@INCのところで示されているようなパスに存在しないのではないですか。

もし、例えばc:/www/public_html/lib/の下など別のディレクトリに
jcode.plをまとめよう、としているのでしたら、
use lib qw(C:/www/public_html/lib);
としてそれを@INCに含めるようにしたりすれば良いでしょう。

ひょっとしたらどこかからのサンプルを使ってsubsub.cgiやokikae.cgi
を書いたところでしょうか。だとしたら足りないjcode.plやcgi-bin.pl
をどこかから手に入れて(WWWの世界にごろごろしています)ください。
これらはPerlの標準配布には含まれていませんので。

なお、もうcgi-bin.plはずいぶんと古い時代のものですね。最近は
CGI.pmを使うのが普通かと思います。(これはPerl5に最初から
含まれています) jcode.plに対しても、最近はJcode.pmという
ものがあります。参考まで。
    • good
    • 0

構文チェックは通っても、バグを含んでいれば当然実行時エラーになります。


Perlで実行してエラーを探した方が早いと思いますよ。
    • good
    • 0

見当違いならごめんなさい。


apacheの設定ではcgiスクリプトはpublic_html以下のcgi-binディレクトリにおくようになっているはずですが、エラーメッセージを見るとpublic_html以下にsubsub.cgiやokikae.cgiがあるように見えるのですが。。。これは正しいのかな?
    • good
    • 0

エラーを見る限り、jcode.pmとcgi-lib.plが呼べていないように見えます。


ちゃんとアップロードされてますか?

アップされている場合は、パスが間違っていないかどうか調べてみてください。
    • good
    • 0

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q/usr/local/bin/perl の発音

あまりにも初歩の質問かもしれませんが、
/usr/local/bin/perl
・・・を、声に出すとすると、
/ユーザー/ローカル/ビン/パール
・・・で、良いのでしょうか?

Aベストアンサー

新版 UNIX 由来/読み方辞書
http://x68000.q-e-d.net/~68user/unix/unix-term-dic.html

Q#!/usr/local/bin/perlの変更。

┬ cgi_script
│   └***.cgi

└ access_g
    └11111
      └22222
        └***.cgi

今まで、cgi_scriptフォルダの直下にあるcgiファイルの一番上の行は
#!/usr/local/bin/perl
できちんと動作していました。

今は、そのcgi_scriptフォルダと同じところにあるaccess_gフォルダの中にある、
11111フォルダの下の2222フォルダの下にあるcgiファイルを実行させたいのですが、
#!/usr/local/bin/perl
をどのように変更していいかわからなくなってしまいました。

動作させたいcgiファイルはcgi_scriptフォルダの中に入れたところきちんと動作したので、
動作上の問題はないと思われます。

どうぞよろしくお願いいたします。

Aベストアンサー

それは変更する必要ないですよ。
また、動かない理由としてパーミッション設定をフォルダにもきちんと設定しているでしょうか?
CGIによってはフォルダのパーミッションをすべて「777」にしないと動かない物もあります。

QPerlの初歩の初歩の初歩(#!/usr/local/bin/perlについて)

いつもお世話になっています。
Perlを勉強し始めて1か月たっていない人間です。
調べてもよく分からず、気持ち悪いので
どうか教えてください。

Perlで記述するとき1行目にperlへのパスを書きますが
プロバイダでのパスは「#!/usr/local/bin/perl」です。
私のPC環境では「#!d:/perl/bin/perl」になります。

ある日、PC環境で動作検証するとき
間違ってプロバイダのパスのほうを記述してしまいました。
しかし、それでもPC上で動作しました。

なぜパスが違うのに動作するのでしょうか?

なお、わけの分からないまま
「Perlへのパスを通す」というのを昔
やったことがあります。関係がありますか?

ある場合、それをすると
「#!d:/perl/bin/perl」の「d:/perl/」の部分が
「/usr/local/」と同になるということなのでしょうか?

Aベストアンサー

httpdの種類や設定によっては1行目のパスを無視して動作させることが出来ます。
例えばAnHTTPDは最初からcgiの拡張子とperlを関連付けて使う仕様だった気がします。
Apache1.3(Win)もWindowsのOSでcgi拡張子とPerl.exeの関連付けがしてあれば動作させることが出来ます。

Qhttp://www.test.cgi/index などのCGI名のあとのパス名

http://www.test.cgi/index
のようになっているものを見かけるときがあります。普段は
http://www.test.cgi?mode=index
などしているのですが、どのような仕組みになっているのでしょうか?
これはPerlに限らず、CGIとして動作するものなら実装できるのでしょうか?
疑問に思ってしまったので、ご回答のほどをよろしくお願いします。

Aベストアンサー

PATH_INFOと呼ばれる情報です。Perl/CGIであれば環境変数の$ENV{'PATH_INFO'}で取得する事が出来ます。クエリー(?xxx)が$ENV{'QUERY_STRING'}で取得出来る事と同じ要領です。組み合わせてtest.cgi/path/info?query=stringのようにする事も出来ます。(それぞれ上記の環境変数で別々に取り出せます。)

他の言語に関しても取得出来ます。言語名とPATH_INFOで検索をかけてみてください。(例えば『php path_info』等)

Aベストアンサー

>画像ヘッダとはどういうものでしょうか?

Content-type: image/gif
Content-type: image/png
Content-type: image/jpeg

など、画像タイプごとに決まっています。
<img>タグに普通の画像ファイルが指定されている場合は
Webサーバが画像ファイルの拡張子から判断して返してくれ
ますが、CGIから返されるデータの種類は拡張子からは判断
できないのでCGI内部からヘッダを返す必要があります。


●CGIがPerlの場合で、GIF画像をCGIから返す例
#!/path/to/perl
print "Content-type: image/gif\n\n";
open(GIF, "file.gif");
binmode(GIF); binmode(STDOUT);
print <GIF>; close(GIF);

もちろん、CGIからは画像フォーマットを返せばいいので、
ファイルから読まずにあらかじめCGIソース内に画像データ
を持っておいて出力する方法も可能です。


ちなみに、多くのCGIではHTMLコンテンツを返す場合が多い
ので、ヘッダは以下のようになります。

print "Content-type: text/html\n\n";

>画像ヘッダとはどういうものでしょうか?

Content-type: image/gif
Content-type: image/png
Content-type: image/jpeg

など、画像タイプごとに決まっています。
<img>タグに普通の画像ファイルが指定されている場合は
Webサーバが画像ファイルの拡張子から判断して返してくれ
ますが、CGIから返されるデータの種類は拡張子からは判断
できないのでCGI内部からヘッダを返す必要があります。


●CGIがPerlの場合で、GIF画像をCGIから返す例
#!/path/to/perl
print "Content-type: image/gif\n\n...
続きを読む


このカテゴリの人気Q&Aランキング

おすすめ情報