Perl Perl_2
Perl 「 モジュール 」 CGI::Crap ファイルアップロード 実用的なコード 01 (0x10e)

目次 - Perl Index
Theme
Perl について、復習を兼ねて断片的な情報を掲載して行く連載その 0x10e 回。
CGI.pm で、実用的なファイルアップロードの処理を確認する。その 01 回。「 CGI::Carp 」について。
実用的なプログラムの冒頭
Cgi upload - perlmeme.org を引き続き参照して、実用的なファイルアップロードプログラムを確認します。
実用的なコードの冒頭部分は次の通りです。
#!/usr/bin/perl -T
use strict;
use warnings;
use CGI;
# 本番で削除する
use CGI::Carp qw(fatalsToBrowser);
# アップロードファイルの最大サイズを 100k に設定
$CGI::POST_MAX = 1024 * 100;
# ファイル保存のためのサブルーチンを呼び出し
# 関数プロトタイプに $ ( スカラコンテキスト ) を指定。
sub save_file($);
前回 (0x10d) では、1 行目に指定された、コマンドスイッチ「 -T 」を確認しましたが、今回は、8 行目に指定してあるモジュール ( CGI.pm のサブクラス ? ) 「 CGI::Carp 」を確認します。
CGI::Carp
通常 CGI スクリプトプログラムでは、エラーが発生した際の原因究明が困難だと言います。 なぜなら、CGI スクリプトは碌なエラーログを出力しないからです。
実際に僕も、これまでの検証の中で、CGI の動作確認に苦労した覚えがあります。Perl プログラムとしては特に問題はないけれど、CGI プログラムとしては、意図した動作をしてくれない場合がある訳です。
きっと何かがおかしいはずなのですが、上述の通り、CGI プログラムは碌な情報を出力しないので、実質的に、目視でコードの精査を繰り返す他に仕様がありませんでした。
モジュール「 CGI::Carp 」は、こうした不便を解消してくれるモジュールです。その機能は、httpd またはその他に対して、より具体的な CGI のエラーログを書き込みます。
CGI::Carp - perldoc.jp の解説では、CGI::Carp は、モジュール「 Carp 」の CGI 版であるかの様に解説されています。モジュール Carp については以下のページを参照すると分かり易いかもしれません。
perl - use Carp; # warn() と die() だけじゃなくて - 404 Blog Not Found
エラーを Web ブラウザに書き出す
モジュール「 CGI:Carp 」は、標準で httpd のエラーログに出力を行う様に設定されていますが、予め「 fatalsToBrowser 」という関数をインポートしておくことで、その出力を Web ブラウザ向けに変更することが可能です。
今回の実用的なファイルアップロードプログラムでも、次の様にして関数「 fatalsToBrowser 」を明示的にインポートしています。
use CGI::Carp qw(fatalsToBrowser);
試しに、(0x10a) で利用した、ファイルアップロードのための基本的なプログラムコードで、CGI::Carp を利用したところ、次の様な警告が Web ページ上に表示されました。

ワオ。
エラーの内容は次の通りです。致命的なエラーではないので、実際にはファイルのアップロードが可能です。
Could't open UPFILE/ for writing: Is a directory at /your/system/path/to/htdocs/cgi_program.cgi line 60.
( 開けませんでした UFILE/ を 書き込み様に; ディレクトリは /your/system/path/to/htdocs/cgi_program.cgi の 60 行目です. )
この警告の原因は、プログラムコードの以下の部分が原因です。
# 書き出しモードでファイルハンドルをオープン
open (OUTFILE, ">", "$output_file")
or die "Could't open $output_file for writing: $!";
書き出しモードでオープンするファイルハンドルの対象になっている $output_file には、メソッド $param() で取得するファイル名が入っていますが、ページにアクセスした初回では、ファイル名が空の状態なので、警告が発生していると思われます。
実際に、[ ファイルを選択 ] ボタンから、ローカルのファイルを指定してあげれば、ファイルハンドルを正常にオープンすることが出来るので、アップロードも問題なく行われます。
続けて記述されている、次のメッセージは、CGI::Carp が出力する標準のメッセージで、関数 set_message() によって任意の内容に変更可能です。
For help, please send mail to the webmaster(www@drive.ne.jp), giving this error message and the time and date of the error.
( 助けを求めてください, メールを送って ウェブマスター (www@drive.ne.jp) に, 提供して このエラーメッセージと 日時を このエラーの. )
僕は、レンタルサーバ Drive Network を利用しているので「 www@drive.ne.jp 」のメールアドレスがウェブマスターとして表示されていますが、実際には、サービス事業者にメールをしても、通常は相手にしてもらえないかと思われます。
当該ページの公開時にも CGI::Carp の機能を残しておく場合は、早々に変更しておいた方が良いかもしれません。
0x10e -> 0x10f へ
Perl プログラムのエラー処理には、「 CGI::Carp 」の様に、「 Carp 」の名前を関したプログラムがよく使われています。
英語で「 Carp 」と言った場合、日本人の僕は、通常魚の「 鯉 」つまり、「 広島東洋カープ 」を連想する訳ですが、その他に、「 文句を言う 」や「 あらさがし 」をする等の意味があることを知りました。
コンピュータプログラミングに使われる「 Carp 」の意味が、「 鯉 」を意味するのか「 あらさがし 」を意味するのか分かりかねていたところ、「 計算機 ( コンピューター ) 援用信頼性プログラム 」なる用語を発見しました。
これは「 Computer-Aided Reliability Program 」または、「 Computer-Assisted Reliability Program 」と表記されます。
プログラミングの「 Carp 」は、おそらくこれのことだろうと腑に落ちました。
次回も引き続きプログラムの冒頭部分を確認します。
参考情報は書籍「 初めての Perl 第 6 版 」を中心に perldoc, Wikipedia および各 Web サイト。それと詳しい先輩。
目次 - Perl Index
Perl mp2 翻訳 Web コンテンツ圧縮の FAQ (d228)
Perl mp2 翻訳 既知のブラウザのバグの回避策をいくつか (d227)
Perl mp2 翻訳 Perl と Apache でのキュートなトリック (d226)
Perl mp2 翻訳 テンプレートシステムの選択 (d225)
Perl mp2 翻訳 大規模 E コマースサイトの構築 (d224)
Perl mp2 翻訳 チュートリアル (d223)
Perl mp2 翻訳 既知のブラウザのバグの回避策をいくつか (d227)
Perl mp2 翻訳 Perl と Apache でのキュートなトリック (d226)
Perl mp2 翻訳 テンプレートシステムの選択 (d225)
Perl mp2 翻訳 大規模 E コマースサイトの構築 (d224)
Perl mp2 翻訳 チュートリアル (d223)