AN HTTPD ゲストブック/コメント集(2002年5月16日02:26)


中田昭雄 nakata@st.rim.or.jp 2002/05/22 21:12

靴下さんの Perl のエラーは、syntax error が出ている行の文法エラーでした。


中田昭雄 nakata@st.rim.or.jp 2002/05/17 21:01

靴下さん、
秀丸を使っているのでしたね。
いとさんが言う通り、「エディタ的」行番号表示で、「はりつけ」るのではなく CGIのファイルを読み込んだ方が間違いが少ないでしょう。

ファイルはそのまま送ってもらってかまいません。


靴下カタオ 2002/05/17 01:04

中田さん、Richard さん、どうもありがとうございます。
エラーについて基本的なことがわかっていなかったようで、
おふたりの説明を読んで、これが AN HTTPD に直接かかわる問題ではない
ということは理解できました。
Richard さんのおっしゃる、
ふたつのメッセージは実質的には同じことを述べている、
ということもわかります。

中田さんから教えていただいた行番号についての問題は
やはり私の数え方がおかしかったのだと思います。
もう一度調べて検討したいと思います。
ただ、 AN HTTPD とは無関係とはいうものの、
できればファイルを見ていただきたいと思います。
見ていただく準備をしてからご連絡させていただきたいのですが、
そのときはまたよろしくお願いします。

どうもありがとうございました。


いと gfh05223@nifty.com 2002/05/17 00:59

靴下さん、行番号が一致しない件ですが

Perlでは行頭から改行コード(LF, CR+LF など)までを 1行と数えていると思います。
テキストエディタでもこれと同じ行の数え方をすれば、エラーメッセージ中の行番号と
Perlスクリプトソースの行番号は完全に一致するはずです。

テキストエディタでは改行までを 1行と数える以外に、ウィンドウの右端で折り返した
ときに折り返った部分にも行番号を振る表示方法があるものもあります。私が使っている
EmEditorでは前者を「論理座標」後者を「表示座標」と呼んで行番号表示方法の切り換えが
可能です。

秀丸エディタは全く使ってないのでその辺りがどうなっているのかと思ってGoogleで
「秀丸エディタ 行番号表示」を検索したところ、以下のページがみつかりました。
http://cucu81.jp/@perl/contents/01/p02-02.html

秀丸エディタでは「エディタ的」と「ワープロ的」と呼んで区別しているようです。
靴下さんの場合、もし設定が「ワープロ的」になっているなら「エディタ的」に変えて
表示させれば206行目にみつかりませんか?

あとスクリプトを「はりつけた」と言われているのがちょっと気になりますね。
秀丸エディタで直接そのスクリプトファイルを開いた方が確実ではないかと思います。


中田昭雄 nakata@st.rim.or.jp 2002/05/16 21:46

靴下さん、
Richard さんの説明もありますが、誤解のないように再度説明します。

syntax error ... 以下の3行のエラーメッセージは Perl が出しているメッセージです。
AN HTTPD は Perl が出しているメッセージをそのまま表示しているだけです。

コマンドプロンプト(DOSプロンプト)でC:\www\ashizuka\public_html\postmail01に移り、
perl postmail01_w.cgi
とすることで同じエラーが出るでしょう。
このことから AN HTTPD が無関係で、Perlの文法エラーであることがわかると思います。
プロバイダの UNIX サーバなどでも、HTTPサーバのエラーログなどに同じエラーメッセージが出ているはずです。

いずれにしてもPerl のエラーメッセージですから、文字通り解釈できないとすれば、 ActiveState などに問い合わせをするべきでしょう。

行番号が表示できるエディタを使っているのでしょうか?
>syntax error at C:\www\ashizuka\public_html\postmail01\postmail01_w.cgi line 206, near ") {"
について言えば、文字通り 206行目に ") {" があるはずです。 206行目にないとすると行番号がおかしいです。 あるいは、違うフォルダにあるソースを見てしまっているとか。。。?
もちろん "syntax error" の原因が 206行目にあるとは限りません。 

http://www.kt.rim.or.jp/~kbk/perl5.doc/perldiag.html
の syntax error のところも参考にしてください。
本当に(1)はエラーなしで(2)でそのエラーになるとすると、ちょっと原因はわかりません。
どうしてもわからなければ、2つのファイルをメールで送ってくれれば見てみますけど。


Richard YS vanAntwerp ys_c@po3.nsknet.or.jp 2002/05/16 19:01

靴下カタオさん(2002/05/16 02:26投稿分)へ

>エラー表示の行番号とスクリプトの行番号が
>一致していないようなのです。

 よくある事だと思いますが。ANHTTPDとは無関係だと思います。
Perl入門のサイトを探した方が早いのではないでしょうか?

 ちなみにANHTTPDが吐く細かいエラーメッセージは、その他のISPが
提供するようなサーバの吐く「internal server error」に含まれる
内容で、同義であり、あなたのスクリプトに問題があるとどちらの
サーバも指摘しているわけです。ANHTTPDだけが違った動作をして
いるわけではないと思います。


靴下カタオ 2002/05/16 08:56

なかおさん、どうもありがとうございます。
実は、単純かも知れないんですけど、ひとつの問題がなかなか解決できないでいます。

(1) 
if ( $_ eq "color01" || $_ eq "color02" ) {
}
#ア if (substr($_, 0, 5) eq "color") {
#ア }

だと、AN HTTP Server でも、プロバイダでもエラーは出ないのに

(2)
#ア if ( $_ eq "color01" || $_ eq "color02" ) {
#ア }
if (substr($_, 0, 5) eq "color") {
}
だと AN HTTP Server では

Error 500
CGI エラー - Content-Type ヘッダが正しくありません。
CGI 出力メッセージ:

syntax error at C:\www\ashizuka\public_html\postmail01\postmail01_w.cgi line 206, near ") {"
syntax error at C:\www\ashizuka\public_html\postmail01\postmail01_w.cgi line 221, near "elsif"
Execution of C:\www\ashizuka\public_html\postmail01\postmail01_w.cgi aborted due to compilation errors.
というメッセージが発行され、プロバイダでは

Internal Server Error
The server encountered an internal error or misconfiguration and was unable to complete your request.

というというメッセージが発行されます。
もちろん他には全く書き換えていませんが、AN HTTP Server の Error 500 は、これを文字どおりに解釈していいものでしょうか(というより、文字どおりに解釈できないと思うんですが)。
問題の行の近くには ") {" や "elsif" を含む行がいくつかありますが、ソースの 206行目や 221行目にはこの語はありません。

行番号が特定できれば解決できるというわけではないですが、この場合に限らず、行番号を知る方法があればデバッグも少しは楽になると思い、質問させていただきました。
できればまたよろしくお願いします。


なかお none 2002/05/16 07:13

エラーが出る場合、エラーの行かその行より前に間違いがあると思います。
この場合はカッコが間違っているのではと思いますが


靴下カタオ 2002/05/16 02:26

お世話になっております。

エラーについて、基本的なことをお伺いします。

syntax error at C:\www\ashizuka\public_html\postmail01\postmail01_w.cgi line 206, near ") {" 
というようなエラーを調べるために、
スクリプトを『秀丸』というエディタにはりつけて、
行番号がわかるようにしたのですが、
エラー表示の行番号とスクリプトの行番号が
一致していないようなのです。

汎用機の COBOL でもトレースの行番号は
ソースリストのではなくて
コンパイルリストのものと一致していたので
Perl でも同様なのかという気がします。

エラーの行番号が実際のソースのどこに当たるのか、
簡単にわかる方法はないでしょうか。