CGIが動いている場合のエラーか所の特定
「I'm fine.」という表示が出る場合は、CGI実行はされていてプログラムのどこかに問題があります。開発環境ではうまく行くのにサーバではうまく行かない場合の原因として考えられるのは以下のような事項です。- Perl のバージョンが違って期待通りに実行されていない
- ファイルの読み書きを行う場合に、対象ファイルのパスをサーバ用に書き換えていない、またはパーミッションが無い (エラー処理が適当にされていない)。
- メールの送信など、ネットワークに関わる部分で失敗している (エラー処理が適当にされていない)。
エラーログが見られる場合
エラーログが見られる場合は、プログラムの切れ目 (50~100行ごと程度) に以下の行を挿入していきます。warn __LINE__;この状態でCGIを実行すると、実行された部分まではエラーログに行番号が表示されます。このため、行番号が途切れた部分でエラーが起こった事が分かります。エラーの範囲が分かったら、さらに細かく同じ行を追加して問題となっている個所を特定します。
エラーログが見られない場合
エラーログが見られない環境の場合は、やむをえませんのでブラウザの画面に行番号を一時的に書き出します。以下のコードで行番号と「<br>」タグを書きします。print __LINE__; print "<br>\n";但しこの場合、HTTPヘッダを出力する前にこの記載するとそれが元で500番のエラーになりますので、HTTPヘッダの出力の後だけに記載します。それで全く出力がされない場合は、HTTPヘッダ出力の前にエラー原因がある事になりますので、下記のヘッダをプログラム冒頭に追加した上で行番号の出力を試します。
binmode STDOUT; print "Content-type: text/plain\r\n"; print "\r\n";エラーの範囲が分かったら、さらに細かく同じコードを追加して問題となっている個所を特定します。
詳細情報の出力を行う Data::Dumper
プログラムの問題個所が特定できたらその周辺のプログラムコードを眺めて問題が無いかを確認しますが、ぱっと見てもどこが問題か分からない場合、役に立つのは、使っている変数にどのような値が格納されているかの出力です。変数の中味は、以下のようなコードで表示できます。上がエラーログへの出力、下がブラウザ画面への出力です。
warn "valname=$valname";
print "valname=$valname <br>\n";表示したい変数が配列やハッシュだった場合は、標準モジュール Data::Dumper が便利です。このモジュールは、配列やハッシュの内容を分かりやすく視覚化して表示してくれます。使い方は以下の通りです。
エラーログに出力する場合
use Data::Dumper; warn "valname=".Dumper(\%valname);ブラウザ画面に出力する場合
use Data::Dumper; print "<pre>valname=".Dumper(\%valname)."\n</pre>";変数名の前に「\」を付けるのがポイントです。
出力は、例えば以下のようになります。
my %hash; $hash{mykey1} = 'value'; $hash{mykey2} = [1,2,3]; use Data::Dumper; warn Dumper(\%hash);出力されたところ
$VAR1 = { 'mykey2' => [ 1, 2, 3 ], 'mykey1' => 'value' };Data::Dumper の出力中にある「$VAR1」は Data::Dumper モジュールが自動的に付ける変数名です。無視して構いません。また、ハッシュの場合表示される順番は順不同になります。
変数の中味を出力してみたら期待していない値が入っていたり、代入されているはずの値が見当たらない場合はそこがエラーの原因になっている可能性があります。もし期待と違う変数があったら、プログラムをさかのぼって変数の出力を再度行い、どこで代入がうまく行っていないのかを確認します。