blog20100901

2013/08/20 - プログラミング言語 Perl にまつわる etc. - Perl monger
参考 : perldoc, perldoc.jp, search.cpan.org, perldoc.perl.org ...
「 初めての Perl 第 6 版 」(オライリー・ジャパン発行 ISBN978-4-87311-567-2) 」
「 続・初めての Perl 改訂版 」(オライリー・ジャパン発行 ISBN4-87311-305-9) 」
「 Effective Perl 第 2 版 」(翔泳社発行 ISBN978-4-7981-3981-4) 」 ... etc,.

Perl Perl_2

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

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 ページ上に表示されました。

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

ワオ。

エラーの内容は次の通りです。致命的なエラーではないので、実際にはファイルのアップロードが可能です。

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)の記事
 Perl mp2 翻訳 Web コンテンツ圧縮の FAQ (d228) (2023-10-11 23:49)
 Perl mp2 翻訳 既知のブラウザのバグの回避策をいくつか (d227) (2023-05-26 15:41)
 Perl mp2 翻訳 Perl と Apache でのキュートなトリック (d226) (2023-05-19 17:05)
 Perl mp2 翻訳 テンプレートシステムの選択 (d225) (2022-08-15 22:23)
 Perl mp2 翻訳 大規模 E コマースサイトの構築 (d224) (2022-06-15 20:43)
 Perl mp2 翻訳 チュートリアル (d223) (2022-06-15 20:42)
上の画像に書かれている文字を入力して下さい
 
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。

Llama
リャマ
TI-DA
てぃーだブログ
プロフィール
セラ (perlackline)
セラ (perlackline)
QRコード
QRCODE
オーナーへメッセージ

PAGE TOP ▲