Perl言語のオンライン文法チェッカーについて

このQ&Aのポイント
  • httpdの1.42pで表示できないCGIがあり、Perl言語のオンライン文法チェッカーを使用してチェックしましたが、文法に問題はなさそうです。
  • httpd上では表示できないが、サーバー上では問題なく動くCGIプログラムについて、Perl言語のオンライン文法チェッカーでチェックした結果、文法に問題はないという結果が得られました。
  • Perl言語のオンライン文法チェッカーによれば、CGIプログラムの文法には問題がないようですが、httpd上で表示できない原因については分からないとのことです。
回答を見る
  • ベストアンサー

Perl言語のオンライン文法チェッカーについて

以前、こちらのサイトで『httpd の1.42pで表示出来ないCGIがあるのですが・・・ 』と質問させていただいたものです。 その時の同じcgiプログラムなのですが、現在もhttpd上では表示できません。サーバー上では問題なく動いています。 今年8月にレンタルサーバーを移行する事になり、念の為、cgiに不具合がないか調べている所です。 しかし、じっくり見直してみたのですが、どうしてもどこがいけないのか見つけ出せません。 そこで、インターネットで調べた所『Perl言語のオンライン文法チェッカー』(http://www.e777.co.jp/perlcw/) というサイトを見つけました。 このサイトでチェックしてみた所、tmp.pl syntax OK と表示されました。 サイト上の説明では、『「tmp.pl syntax OK」と表示された場合は文法的な問題は全くありません。』 と書かれています。 この表示を信頼してもでしょうか? 文法に問題がなければ、サーバー上で暴走する事はないと考えてよいのでしょうか? また、httpd上では表示できないのに、サーバー上では問題なく動く、またPerl言語のオンライン文法チェッカーでも、tmp.pl syntax OK と表示されるというのは、何に問題があると考えたらよいのでしょうか? 皆さん、アドバイス、ご指導のほどよろしくお願い致します。

  • CGI
  • 回答数4
  • ありがとう数7

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

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

では2件ともログに記録するやりかたを書きます >c:\hoge>perl hoge.cgi これを >記録するfile名 をつけて(名前は適当に) c:\hoge>perl hoge.cgi>PERL-TEST-01.txt telnetの方は途中でlogfile c:\hoge\telnet-test-01.txt を追加します  (#2と重複しますが 通し で書きます) c:\hoge>telnet <=と打って[Enter]を押します TELNET> set logfile c:\hoge\telnet-test-01.txt <=と打ってENTER TELNET> set localecho <=と打ってENTER TELNET> set crlf <=同上 TELNET> open localhost 80 <=同上 localhostと接続中.... と表示されたら HEAD /~tarou/test/test.cgi HTTP/1.0 <=と打ってENTER2回押す(入力した文字が一番上に重なって見えるので見難いですが このとおりに入力してください) PERL-TEST-01.txt を開いてみたとき Content-type: text/html <=ここに空行が有ればOK  <html>以下HTML文省略  (ヘッダの終わりを示す空行の上はContent-typeだけでなくSet-Cookieヘッダも付く場合や Locationヘッダになる場合も有ります) c:\hoge\telnet-test-01.txtの中を開くと HEAD /~tarou/test/test.cgi HTTP/1.0 こそ(末尾の "こそ”は「ウェルカムメッセージ と重なって入力するため、その末尾の "こそ" が残っています) HTTP/1.1 200 OK <=正常ならこうなります Date: Fri, 30 May 2008 12:28:21 GMT Server: Apache/2.2.8 (Win32) Connection: close Content-Type: text/html <=fileの末尾がここの空行に成るはずです **ログを取りながらTESTする説明は以上 >タグの最後にあたる、</HTML>が表示されれば良いのでしょうか? 意図したHTML文が表示される=プログラムが動いてる ですが =CGIとして正常 とはなりません webサーバーが認識できる形式のヘッダ <=空行 が表示されることが重要です 実は500 Internal Server Errorが出ると言うのはプログラムが動いたか 動かなかったかとは直接関係有りません CGIを実行しようとして httpdに返ってきた文字列が webサーバーが認識できる形式のヘッダ+空行 で始まっていないと500エラーになります ですから掲示板CGIなどで投稿文の書き込みに成功してもヘッダがおかしければ500エラーになります Perlの構文エラーの時に500エラーとなるのはプログラムがうまく動かなかったからが直接の原因ではなく Perlがエラーメッセージを吐き、それがヘッダとして認識できないからです >localhostと接続中.... のあとに入力する文字のタイピングミスかな? 私にはそうとしか思えません ステータスコード501 は リクエストヘッダがおかしいとそうなります HEAD または GET か POST ならいいのですが DEAD なんて送ると501です 「HTTP Status Code」<=このページ詳しいです http://www.studyinghttp.net/status_code

kyonmimi2006
質問者

補足

umasikajiroさん、何度もありがとうございます。 一般的なデバッグ方法で、cgiを実行した場合も Content-type: text/html <空行> が表示されていませんでした。(^^ゞ プログラムの最後にHTMLを書き出すようにしているのですが、 書き出しを下記のようにしました。 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <HTML lang="ja"> <HEAD> <META http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <META http-equiv="Content-Style-Type" content="text/css"> この為、<META>タグ内に書いてあるため、いらないと思い消してしまっていたようです。 初歩の初歩でお恥ずかしいです。(^^ゞ ネットで調べても、『Content-type: text/html』がないとエラーになると書かれていますね。 それにしても、なぜサーバー上では動いていたのかわかりません。 <META>タグ内に書いてあった為でしょうか? とっても不思議です。 どうもありがとうございました。 P.S. 長くなったため、補足欄に書かせて頂きました。<m(__)m>

その他の回答 (3)

回答No.4

>それにしても、なぜサーバー上では動いていたのかわかりません。 あ~ そういえば、すっかり忘れてましたけど思い当たる節が ひょっとしてヒアドキュメントで print<<HTML; <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <HTML lang="ja">以下略 みたいに書いていませんでした? これだとprint<<HTML; の下が一行空いてますので 空行を出力しています (もしくはスクリプトの上のほうに print"\n"; とだけ書いても空行 ) Content-type: text/htmlがないので宜しくない状態ですが 空行だけ出力すると ヘッダが終わり と言う事だけはApacheは理解するので 確か DefaultType text/plain(設定によるがほとんどのサーバーはこのまま) で出力したはずです。 で、MSIEの場合はtext/plainヘッダを貰っても 文中にHTMLタグが有るとHTMLとして表示します (FireFoxなどMozilla系はプレーンテキストとして表示) 今、LinuxのとXPのApacheで試してみましたがやはりそうなりました。 そのあたりAnhttpdは違うのかも知れません

kyonmimi2006
質問者

お礼

umasikajiroさん、確認までしていただいたようで、申し訳ございません。<m(__)m> ご指摘どおり、ヒアドキュメントを使って書いています。 Perl/CGI辞典のサンプルプログラムを改良して作っているので、 print <<"EOM"; と書いていますが。 原因もわかり、すっきりしました。 何度も丁寧なご説明、どうもありがとうございました。<m(__)m>

回答No.2

Warning: CGI TerminateProcess で検索してみましたが http://www.st.rim.or.jp/~nakata/gbook/gbook.78.htm anhttpd作者の方が「直接は関係ないだろうと思います。 」と書かれています また http://homepage1.nifty.com/yito/namazu/gbook/20020727.1949.html では「Warning は Error ではないので、何かおかしい現象が出ない限りは、気にしなくてよいと思います。」 ので 原因がやはり不明ですね 勘で答えると CGIが Content-type: text/html\n\n などを吐く前に anhttpdの子プロセスがWarning を吐くのだとしたら 処理できなくてエラーになるかもしれませんが、、、 一般的なデバッグ方法を書いてみます *まず#1に書いた c:\hoge>perl -wc hoge.cgi でsyntax ok が出たら次は -wc無しで c:\hoge>perl hoge.cgi これで実行されますので Content-type: text/html <=空行 などとヘッダが正常に出力されれば まずはOKです。 *次に telnetで anhttpd上のCGIにアクセスします CGIのURLが http://localhost/~tarou/test/test.cgi だと仮定して コマンドプロンプトから(以下にある 80 とは 80port(http接続)です) c:\hoge>telnet <=と打って[Enter]を押します TELNET> set localecho <=と打ってENTER TELNET> set crlf <=同上 TELNET> open localhost 80 <=同上 localhostと接続中.... と表示されたら HEAD /~tarou/test/test.cgi HTTP/1.0 <=と打ってENTER2回押す(入力した文字が一番上に重なって見えるので見難いですが このとおりに入力してください) HTTP/1.1 200 OK  <=ステータスコード200が帰ってきたらOKです

kyonmimi2006
質問者

補足

umasikajiroさん、遅くなりましたが、再びアドバイスどうもありがとうございました。 申し訳ありませんが、再度質問させてください。 1.一般的なデバッグ方法で、cgiを実行した場合の表示について教えて下さい。   > Content-type: text/html   > <=空行   > などとヘッダが正常に出力されれば・・・ とのことですが、 htmlを書き出すプログラムの場合(カレンダー表示のcgiなのですが)、タグの最後にあたる、</HTML> が表示されれば良いのでしょうか? 長いためか、はじめの方のヘッダは表示されません。(スクロールバーを上まで上げても) ただ、この方法で実行した場合、必ずタグの最後</HTML>は表示されます。 2.telnetで anhttpd上のCGIにアクセスした際の出力結果について教えて下さい。 1.の表示でOKと思っているため、telnetで anhttpd上のCGIにアクセスしてみました。 何度も試してみたのですが、HTTP/1.1 200 Document follows とOKの表示が出ることもあるのですが、 HTTP/1.1 501 Not Implemented もしくは HTTP/1.1 404 File Not Found が出ることが多いのです。 404の時には、can't find cgi script or executable と表示されたり、 file doesn't exist or is read protected と表示されます。 なぜ、成功するのか、失敗するのか疑問です。 localhostと接続中.... のあとに入力する文字のタイピングミスかな? と思うのですが、それ以外に何か考えられる事はありますか? この2点について、お時間のある時に教えて下さい。 よろしくお願い致します。

回答No.1

>サーバー上で暴走する事はないと考えてよいのでしょうか? いいえ文法上で間違いが無いのと暴走することは違います。 下記は間違いなく暴走するスクリプトですが #! /usr/bin/perl print"Content-type: text/html\n\n"; print"<html>\n"; print "<head>"; print "</head>"; $a=0; while($a<1) {print "abc\n";} __END__ これで件のページにてチェックすると syntax OK  (と言うか文法的に問題があれば起動しませんので当然暴走もしません)  (逆に言えば 暴走するスクリプトは起動できないような文法ミスは無いってことになります) さらにprint"Content-type: text/html\n\n"; を消してみたり 存在しないライブラリをrequireしても syntax OK おそらく perl -wc でチェックしているものと思われますが >httpd の1.42p とありますのでwindows上でAnhttpdをお使いと思いますけど コマンドプロンプトを起動して CDコマンドで スクリプトの場所に移動してから 使い方が判らなければ=> http://cmd-pro.com/sta_end.html c:\hoge>perl -wc hoge.cgi としても同じチェックが出来ます http://www.apec.aichi-c.ed.jp/project/joho/kanri/katuyou/CGIFrame.htm#aa[2]3d >httpd上では表示できないのに、サーバー上では問題なく動く、 Anhttpdでは駄目だがプロバイダのサーバーでは動くと言う意味かな? さあ? そもそも同じ環境では無いのでそういうこともありえるでしょうね 一つの例としては Unix系サーバーでは一般的にインストールされているモジュールやライブラリが ActivePerlには含まれて居なければ そうなりますが AnHttpd使ったこと無いので判りませんが エラーログって有りませんか?

kyonmimi2006
質問者

補足

umasikajiroさん、アドバイスありがとうございます。 暴走しないかどうかと文法チェックは別物なんですね。 何かこの『ページを表示できません。』と表示されるエラーの原因をつきとめる方法はないですかね。 作り直すしかないのかな・・・。 ちなみに、エラーログの記録ですが、下記のように残ります。 Sun May 25 17:15:45 2008 Warning: CGI TerminateProcess 3156 error 5 このログから、何かわかりますか? お時間のあるときでかまいません、またアドバイスよろしくお願い致します。<m(__)m>

関連するQ&A

  • なぜ CGI は Perl 言語で作成/動く環境が多いのか。

    最近 CGI に興味をもちここで質問しながらネット検索をしました。 すると Perl 言語での CGI サンプルが一番多く C 言語で作る CGI の サンプルが少し見つかりました。 私の使っている無料サーバーでも CGI は使えますが Perl 言語だけ有効です。 セキュリティの問題で SSI と組み合わせた C 言語の CGI は実行出来ないようです。 質問内容: (1)なぜ CGI は Perl 言語が一番多いのか?→PHP、Cもあるのに (2)なぜ無料サーバーの多くが Perl 言語しか使えないのか? (3)処理の重い CGI を使うとサーバーがダウンするので使わないようにと  私の使っている無料サーバー(infoseek)でなっています。どの程度の  処理のことでしょうか? 上記の3つまたは1つでもアドバイスをして欲しいです。 回答をお待ちしています。

    • ベストアンサー
    • CGI
  • An HTTPdでPerlを動かす

    An HTTPdとPerlでCGIを動かそうと思います。 PerlをD:\usr\binに、An HTTPdをD:\Httpdにインストールしました。 ドキュメントルートをD:\html_publicに設定しました。D:\html_publicにindex.htmlを置き、IEでhttp://127.0.0.1/とするとindex.htmlが表示されました。 続いてhello.cgiをD:\html_publicに置き、http://127.0.0.1/hello.cgiとしました。すると「Internet Explorer ではこのページは表示できません」との表示がでました。 Perlが認識されないのであれば、hello.cgiのコードが表示されるものではないでしょうか。 あるいはAn HTTPdでは指定された拡張子以外は認識されないのかもしれないと思い直しても、一応CGIに関しては、 .pl,.cgi D:\usr\bin\perl.exe で定義しています。 設定のどこに間違いがあるのでしょう。

    • ベストアンサー
    • CGI
  • mod_perlでファイルが開けない

    拡張子.plをapacheのmod_perl2で動作するようにしました。 printでHTMLタグの出力などはできますが、openすると403になります。その403も、何かよく分からない英文と同時に表示されていました。 httpd.confで.plを普通のCGIで動作させたならopenできたので、mod_perl2を使うとopenできなくなるということまでは分かりました。 openできるようにするためにはどのようなことを試せばよいですか?

  • perlの文法について

    はじめましてstaraman_sです。 今はPerl/CGI辞典という本を使いながらPerlの勉強をしていますが、インターネットで検索しても解決できず困っています。 皆さんのお力をお貸しください。 疑問点 sub getCookie { my ($tmp, $name, $value); for $tmp (split(/; */, $ENV{'HTTP_COOKIE'})) { ($name, $value) = split(/=/, $tmp); $value =~ s/\%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg; $COOKIE{$name} = $value; } } 本の中の掲示板のプログラムの中に上記のようなプログラムが書いてあるのですが、最後の方に$COOKIE{$name} = $value;とあります。変数$COOKIEの後に中括弧を使い{$name}と書いているのは、どういった文法からきているのでしょうか。 よろしくお願いいたします。

    • ベストアンサー
    • CGI
  • サブルーチン Perl みたいに C言語 で使うには 

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

  • c言語とperlのcgi設定方法

    (Arch linuxにてlighttpdサーバを立ち上げています) cgiは一般にperlが多いとは思いますが、C言語からのcgiも試みています perlによるcgiを有効にするにはlighttpd.confの設定に以下を追加  server.modules += ( "mod_cgi" )  cgi.assign = ( ".cgi" => "/usr/bin/perl")  static-file.exclude-extensions = ( ".cgi" ) C言語から作成したcgiを有効にするにはlighttpd.confの設定に以下を追加  server.modules += ( "mod_cgi" )  cgi.assign = ( ".cgi" => "")  static-file.exclude-extensions = ( ".cgi" ) 同一のサーバ下で「"/usr/bin/perl"」「""」ともにを有効にする設定方法はありますでしょうか よろしくお願いいたします

  • Perl 掲示板 初心者

    初の投稿で大雑把な質問失礼致します。 (1)目的・・・ホームページに掲示板を設置したい (2)言語・・・Perl (3)文字コード・・・UTF8(Encode) Perlでメールフォームは作ることはできました。 メールに関しては、ネットサーフィンでなんとか完成したのですが、 掲示板は、たくさんでてくるも、どれもうまいこと動作しません・・・ http://webings.net/perl/boardimg1/ ここのサイトのようにしたいのですが、 コピペで貼付けし、サーバーに送り実行すると 書込ファイルが開きませんと表示されます まずファイルの読込から躓いていて、先に進みません・・・ サーバー側に index.html----cgi----bbs.pl----dat----boardimg-----jpg,png,gif等 |-----boardimg.dat このようなフォルダ構造ではないのでしょうか? パーミッションは bbs.pl→777 boardimg.dat→666 そこで、教えて頂きたいのが (1)このサイトで、どう改善すればいいのか・・(すごく大雑把申し訳ないです) (2)初心者でもわかるようなサイト (3)掲示板の仕組み(ファイルの読込、書込について) また、このサイトの掲示板では、Perl内でHTMLが記述されてますが、 ホームページのformからCGI.pmでデータの受け渡し にするほうがいいのでしょうか?

  • C言語のapacheの設定

    apacheを使うとC言語で作ったプログラムもCGIで動かせると聞きました httpd.confをいじるとC言語でも表示されるらしいのですがいじり方が分かりませんでした。 どのようにいじればC言語を動かせますか? apacheのバージョンはapache_1_3_12_win32です。 普通の(perlでの製作)cgiの拡張子のは動かせます。

    • 締切済み
    • CGI
  • Perl初心者なのですが・・・

    Perlを一生懸命勉強し始めたばかりの者です。 言語に関する知識が浅いため、それを考慮に入れた御回答をお願いします。 自分のウェブページに新たにcgiを設置しようとしたのですが、「Inter Server Error」という表示が出てきました。ウェブで調べていくと、Perlにはヴァージョンがあるということが分かりました。ソフトを開発するための言語にヴァージョンがあること自体、頭の中でイメージできません。そこでPerl 5.6というものをダウンロードしたのですが、インストーラーらしきものもなく、困っています。これは私の問題なのでしょうか、それともサーバーの問題なのでしょうか。 とりあえず「Inter Server Error」の解消を第一目標にしております。その点、御回答いただければ助かります。

  • Perl言語を使っています

    Perl言語を使っています URLを定義して、 その、Webサイトの中を表示するといったようなことは 可能なんでしょうか?? もし、可能であれば サンプルソースなど、 おねがいします 文字だけで構いません あと、10文字表示したいのに その、システムが5文字しか 表示できない場合に 残りの5文字はどのようにして表示させるのでしょう 2つも書いて申し訳ございません print "Prel言語使います" だけど、5文字しか表示できないそうなると "Perl言"こうなります、残りの5文字はどのようにすればいいのでしょう

    • ベストアンサー
    • Perl

専門家に質問してみよう