
A 回答 (2件)
- 最新から表示
- 回答順に表示
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サーバーを用意して、必ずローカルで十分テストしてからサーバーに上げましょう。
この回答への補足
メールフォームを使おうと思い、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の使い心地なども合わせて。
それまでこの質問は締め切らずにおいておこうと思います。
その間にどなたか、今回のケースに即する良いデバッグ法、あるいは二重メールが起こりうる原因などご存じでしたら、大変恐縮ですが、ご教授いただけたら幸いです。
No.1
- 回答日時:
Perlにはデバッガ機能があります。
このデバッガでステップ実行ができるので、それで解決できるのではないかと。実行中の変数の値をみたりもできます。
使ったことはないですが、Carpというモジュールでもデバッグが出来るらしいので、環境が許すなら使ってみるのもよいでしょう。
参考URL:http://homepage3.nifty.com/hippo2000/perltips/pe …
この回答への補足
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は起動されますが、パラメーターをチェックしても引数を受け取るパラメーターは「引数=""」の場合の値を示したまま。これで一行ずつコードを進めていっても・・・
申し訳ありませんが、どなたか教えてください。お願いします。
引数の記述はブラウザから実行する場合の「?」「&」を半角スペースにすれば良いようです。あと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/&/&/g;
$value =~ s/</</g;
$value =~ s/>/>/g;
$value =~ s/\x0D\x0A/<br>/g;
$value =~ tr/\t/ /;
$FORM{$key} = $value;
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- オープンソース Pythonのコードをexe化 1 2023/07/03 08:01
- CGI サイト訪問者の情報を取得したい 1 2023/02/21 11:03
- 哲学 夢を見ている時間も「現実の世界を生きている」訳ですよね? 2 2022/10/04 21:02
- Excel(エクセル) シートが違う2枚のエクセルシートにある数値を別シートにコピーしたい(VBA?) 8 2022/03/31 12:24
- Perl perlをバージョンアップしたら、今まで正常に動いていたプログラムが、エラーになってしまった 3 2022/10/05 15:44
- 電車・路線・地下鉄 簡易軌道の新規開業は無理ですか? 7 2023/05/21 12:03
- ホームページ作成・プログラミング CGIが実行可能なHP領域又はレンタルサーバーでおすすめの所を教えてください 現在ホームページ領域の 1 2023/01/01 11:47
- Visual Basic(VBA) excel vbaでselenium basic 3 2022/10/02 12:35
- Perl Perl の外部モジュールの利用方法 3 2022/07/10 18:34
- Excel(エクセル) エクセルでcsvファイルを開いてVBAを使いたい 7 2022/04/28 11:12
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
これをビジュアルスタジオで実...
-
perlでコマンドプロンプト実行
-
Perlソースコードをコンパイル...
-
例外処理のフローチャートの記...
-
ユーザー定義関数に#NAME?が返...
-
初歩的な質問ですがよろしくお...
-
vba userFormのSubを標準モジュ...
-
モジュールとクラスの違いって...
-
Excel VBA 定義されたプロージ...
-
混合言語のデバッグ(VC++6.0,V...
-
「Perl Command Line InterPret...
-
PerlでIPアドレスを取得する方法
-
ディスクの空き容量を求める(W...
-
AWkの配列についてのデバッグ
-
【vba】フォームに書いてあ...
-
VBSがコンパイルエラーになりま...
-
CGI..pmをテストしようとすると...
-
powershellで引数受け取り時に...
-
fetchrow_arrayとfetchrow_hash...
-
フォーム内のテキストボックス...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Perlソースコードをコンパイル...
-
perlのsystem関数内でのコロン...
-
プロシージャの戻り値を取得す...
-
perl拡張子in linux
-
Perlで環境変数を設定するには
-
Mac OS.XでPerlプログラミング
-
自分以外のPerl.exeを強制終了...
-
Xサーバーのcronでcgiが自動更...
-
Catalyst+FastCGIの設定
-
systemの引数の中括弧
-
perlスクリプトをコマンドライ...
-
コードを一行ずつ実行したい。
-
例外処理のフローチャートの記...
-
Excel VBAでリンク切れをチェッ...
-
Excel VBAで、ユーザーフォーム...
-
「デバイスは PRN を初期化でき...
-
LCD ディスプレイを Raspberry ...
-
ユーザー定義関数に#NAME?が返...
-
vba userFormのSubを標準モジュ...
-
Excel VBA 定義されたプロージ...
おすすめ情報