• 締切済み

コードを一行ずつ実行したい。

Perlで記述したCGIをブラウザ上で動かしてみるとうまく動かない。一行ずつ動かすことが出来たら、どこで可笑しなことになっているのか簡単にわかるのに・・・ そんなしょぼしょぼプログラマの儚い夢を実現してくれるツールもしくは方法は存在しないでしょうか。

みんなの回答

  • ORUKA1951
  • ベストアンサー率45% (5062/11036)
回答No.2

>perl -wc board.cgi で一行ずつ実行していきますよ。  ただし、サーバーにtelnetで接続することになるのですが、一般的なサーバーではtelnetは許可されていないでしょう。  私自身は、ブラウザ経由で任意のプログラムに引数を渡しながら、Perlのデバッグが出来るCGIを作って持ってますが、公開の予定はありません。  もちろん、エラーログを閲覧できる環境なら、サーバーのエラーログに記録されてますから、それを見ると良いです。  ただ、一般の方が行う場合は、もっと簡便な方法があって、そのCGIの先頭に #!/usr/local/bin/perl BEGIN{ $| = 1; print "Content-type: text/html\n\n"; open(STDERR, ">&STDOUT"); } と書いておくと、ブラウザからチェックできるはず。 ★なお、CGIはサーバーに上げてテストするものではなく、ローカルで動作確認をしてからサーバーに上げるものですよ。  無限ループに落ちるようなエラーだったりしたら大勢に迷惑を掛けるかも  ローカルにperlやHTTPサーバーを用意して、必ずローカルで十分テストしてからサーバーに上げましょう。

makoji
質問者

補足

 メールフォームを使おうと思い、KENTさんのClipmailを導入しました。  完成したCGIだからと動作確認せずにサイトにアップして、設定確認などは全てサイト上で行いました。特に問題はなく、きちんとメールが発信できるようになりました。  しかし今後のことも考えて、ローカルサイトを設けようと思い、ActivePerlをd:\usr\binに、AnHttpdをD:\AnHttpdに、fake sendmailをD:\usr\libに置き設定しました。この環境で手元の教科書にあったメールフォームを動かしてみたところ、キチンと動きました。次にメールフォームをClipmailに代えてみたところ、何故かメールが2通届くようになったのです。内容は2通とも同じです。  教科書のメールフォームでは正常に動いたのですから、問題はClipmailの方にあるのでしょう。そのClipmailもネット上のサイトでは正常に動いていたのですから、今回の場合、ローカルサイトのClipmailに設定上の問題があるのでしょう。でも設定に関わる部分を再度見直しても、どこにも問題は無さそうなのです。  sendmailを2度呼び出しているはずです。その2回がそれぞれどのような状況で呼び出されているのか分かれば、異常な呼び出しに関わる部分、多分設定に関わる部分ですけど、を改めればいいわけです。  まずコードを一行ずつ目で追いかけてみようと思ったのですが、CGIもPerlも学習していないので、プロの書いた記述に着いていけず断念。そこでデバッガーを使ってソフトに一行ずつ追いかけてもらおうと思った次第です。  >perl -wc clipmail.cgi もやってみましたが、コードが処理されていく流れまでは理解できませんでした。他の二つの方法もエラーログを表示してはくれますが、処理の流れを教えてくれるものではありません。  日本にないのであればとアメリカのYahoo!を検索してみました。するとPerlEditなるソフトを発見。Lite版が49ドル、Pro版が99ドルです。  でもこれでもブラウザからClipmailを呼び出し実際にメールが届く形でCGIを動かして、その動きを監視することはできないでしょうね。単にコマンドラインで「perl clipmail.cgi」とやっただけではメールは届かないようですから。  というわけで、現状ではCGIを勉強した上で、ソースコードを目で追いかけるのが唯一の方法となりそうです。  CGIは今すぐに勉強出来ません。1ケ月ほどしたら手が出せると思います。その時はPerlEditも購入してみたいと思います。  幸いなことにClipmailはサイト上では正常に動いていますし、とりあえずはこれで良しとしたいと思います。  なんかオチがないので、CGIの勉強をして、今回の二重メールの原因が特定できたら、ご報告させてもらいます。PerlEditの使い心地なども合わせて。  それまでこの質問は締め切らずにおいておこうと思います。  その間にどなたか、今回のケースに即する良いデバッグ法、あるいは二重メールが起こりうる原因などご存じでしたら、大変恐縮ですが、ご教授いただけたら幸いです。

すると、全ての回答が全文表示されます。
  • azu1129
  • ベストアンサー率80% (4/5)
回答No.1

Perlにはデバッガ機能があります。 このデバッガでステップ実行ができるので、それで解決できるのではないかと。実行中の変数の値をみたりもできます。 使ったことはないですが、Carpというモジュールでもデバッグが出来るらしいので、環境が許すなら使ってみるのもよいでしょう。

参考URL:
http://homepage3.nifty.com/hippo2000/perltips/perldbg.htm
makoji
質問者

お礼

引数の記述はブラウザから実行する場合の「?」「&」を半角スペースにすれば良いようです。あとCGI側の受け取る部分の変更が必要でした。 以下のように書き換えて問題解決です。 ありがとうございました。 use CGI; $cgi = new CGI; foreach $key ($cgi->param()) {  $value = $cgi->param($key);  $value =~ tr/+/ /;  $value =~ s/%([0-9a-fA-F][0-9a-fA-F])/chr(hex($1))/eg;  $value = jcode::sjis($value);  $value =~ s/&/&amp;/g;  $value =~ s/</&lt;/g;  $value =~ s/>/&gt;/g;  $value =~ s/\x0D\x0A/<br>/g;  $value =~ tr/\t/ /;  $FORM{$key} = $value; }

makoji
質問者

補足

ActivePerl社のPDKを試用してみました。十分な機能です。というか、デバッガーを日頃使いこなさない私の場合、デバッガーの基本的な機能しか試していないのですが・・・ ただしちょっと困ったことが・・・ ActivePerl社のPDKはコマンドラインからCGIをデバッグモードで起動するとプログラムが起動します。私が今作成しているCGIをブラウザから起動する場合、URLは引数込みで例えば 「http://127.0.0.1/listbbs.cgi?num=5670&mode_02=text」 となります。 これをコマンドラインで実行する場合、 「perl -d listbbs.cgi 引数」 となるはずですが、引数の部分の記述はどうなるのでしょうか。 単純に「?num=5670&mode_02=text」とするとエラーが出ます。「?」の部分をスペースに置き換えると最初の引数は読み込みますが次の引数は読み込みません。 ということは「&」に問題があるのでしょう。「&」を「+」に換えたりスペースに換えたりと試してみましたが、うまくいきません。 ネットで調べてみても、プログラム中での引数の渡し方やブラウザから起動する際のURLの記述の仕方などは出てきましたが、コマンドラインから呼び出す際の記述の仕方は出てきませんでした。 現状では引数を読み込まないままデバッグが始まり、PDKは起動されますが、パラメーターをチェックしても引数を受け取るパラメーターは「引数=""」の場合の値を示したまま。これで一行ずつコードを進めていっても・・・ 申し訳ありませんが、どなたか教えてください。お願いします。

すると、全ての回答が全文表示されます。

関連するQ&A