Perl Perl_2
Perl 「 モジュール 」 CGI.pm start_form 確認継続 (0xfd)
目次 - Perl Index
Theme
Perl について、復習を兼ねて断片的な情報を掲載して行く連載その 0xfd 回。
CGI.pm で、HTML フォームの開始と終了を表す要素を生成するメソッド「 start_form() 」をもう少し確認する。
パラメータ enctype
前回確認した通り、メソッド start_form() では、通常次の 2 つの enctype を指定出来ます。
application/x-www-form-urlencoded
multipart/form-data
application/x-www-form-urlencoded
enctype「 application/x-www-form-urlencoded 」は、古くからあるエンコードタイプです。古いタイプであることから、ずっと以前から稼働している多くの CGI スクリプトと互換性があります。
通常、このエンコードタイプは「 テキストデータが入った短いフィールド 」で利用します。
multipart/form-data
enctype「 multipart/form-data 」は、比較的新しいエンコードタイプです。
このエンコードタイプは、「 大きなデータを扱う 」場合に適しています。大きなデータとは、大きなフィールドのテキストデータやバイナリファイル等です。
このエンコードタイプで最も重要な機能は、ファイルのアップロードを実現出来ることです。
エンコードタイプはサブルーチンに格納されている
エンコードタイプ multipart/form-data と application/x-www-form-urlencoded は、利便性を高めるために、それぞれサブルーチン「 &CGI::MUTIPART 」と「 &CGI::URL_ENCODED 」に格納されていると言います。
何が便利なのか、今の僕にはさっぱり分からないので、CGI.pm のコードを確認します。
ファイル CGI.pm の先頭から、「 URL_ENCODED 」を検索すると、まず次の行にマッチングしました。
CGI.pm
---
':form'=>[qw/textfield textarea filefield password_field hidden checkbox checkbox_group
submit reset defaults radio_group popup_menu button autoEscape
scrolling_list image_button start_form end_form startform endform
start_multipart_form end_multipart_form isindex tmpFileName uploadInfo URL_ENCODED MULTIPART/],
これは、(0xb1) で確認した、%EXPORT_TAGS の一部です。
%EXPORT_TAGS には、CGI.pm で利用可能なメソッド ( 関数 ) 群が列挙されてますが、その「 form 」セットの中に「 URL_ENCODE 」と「 MULTIPART 」が記述されている訳です。
ということは。。という見当を胸にして、次のマッチング行にジャンプします。
すると、985 行目から次の記述がありました。
CGI.pm
---
'URL_ENCODED'=> <<'END_OF_FUNC',
sub URL_ENCODED { 'application/x-www-form-urlencoded'; }
END_OF_FUNC
'MULTIPART' => <<'END_OF_FUNC',
sub MULTIPART { 'multipart/form-data'; }
END_OF_FUNC
「 URL_ENCODED 」と「 MULTIPART 」の名前でサブルーチンを呼び出せる様にしています。サブルーチンの中身はと言えば、文字列リテラルでエンコードタイプ名が記述されているだけです。
なるほど、やはり。
エンコードタイプを簡単に指定する
通常、start_form でパラメータ enctype を指定する場合は、次の様に記述します。
print $q->start_form(-enctype => 'application/x-www-form-urlencoded');
# または
print $q->start_form(-enctype => 'multipart/form-data');
しかしながら、&CGI::URL_ENCODED と &CGI::MULTIPART を使えば次の様に記述出来ます。
print $q->start_form(-enctype => $q->URL_ENCODED);
# または
print $q->start_form(-enctype => $q->MULTIPART);
(0xb1) で確認した関数指向スタイルなら、さらに簡潔に記述出来ます。
use CGI::Pretty qw/ :standard /;
print start_form(-enctype => URL_ENCODED);
# または
print start_form(-enctype => MULTIPART);
無用なタイプ数を減らした労力の削減と、タイプミスの確立を軽減する、確かに便利な設定です。
0xfd -> 0xfe へ
今回の疑問は、CGI.pm のコードを直接読むことですぐに解決出来ました。無暗にインターネットを徘徊するよりもはるかに短時間の出来事でした。
ソースコードを読むことと、インターネットを検索することの、どちらがより適切なのかは状況によりけりだと思われますが、そうした状況判断も含めて、Perl ( プログラミング ) の理解が進んでいることを実感しました。
次回も、もう少しメソッド「 start_form() 」を確認します。
参考情報は書籍「 初めての 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)