Perl Perl_1
Perl 「 モジュール 」CGI.pm 関数指向スタイル (0xb1)
関数指向スタイル
Perl 「 モジュール 」CGI.pm オブジェクト指向スタイル (0xb0)
モジュール CGI.pm の関数指向スタイルでは、直接扱わないデフォルトのオブジェクトがあると言います。
関数指向スタイルでは、HTML の作成・クッキーの管理等を行う場合、直接オブジェクトを操作せずに、関数を呼び出して操作します。
この場合、インタフェースは簡素になりますが、オブジェクトは 1 度に 1 つしか扱えません。反対に言えば、オブジェクト指向スタイルでは、1 度に複数のオブジェクトを扱えるということです。
関数指向スタイルとオブジェクト指向スタイルの違いは、関数指向ではソースコードの名前空間に関数のセットをインポートする必要があることと、オブジェクトを明示的に作成しないということです。
通常関数のセットは、「 standard 」セットをインポートします。
HTML の生成
関数指向スタイルで、HTML の生成を確認します。
次のコードは perldoc.jp に例示されているものです。
use CGI qw/:standard/; # load standard CGI routine
print header, # create the HTTP header
start_html('hello world'), # start the HTML
h1('hello world'), # level 1 header
end_html; # end the HTML
3 行目からの print 文は、前回も確認した通り、読み易い様に改行してあるだけで、実際にはカンマ区切りのリストデータを print 文に渡してあるだけです。
オブジェクト指向スタイルでは、「 $q = CGI->new 」によって $q というオブジェクトを作成していましたが、関数指向スタイルではこれを行いません。
また、プラグマ use でモジュール CGI.pm を読み込む際に関数セット「 :standard 」を合わせて読み込んでいることが分かります。
上記の実行結果は次の通りです。
Content-Type: text/html; charset=ISO-8859-1
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US" xml:lang="en-US">
<head>
<title>hello world</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
</head>
<body>
<h1>hello world</h1>
</body>
</html>
この実行結果は、前回のオブジェクト指向スタイルで確認したと同じです。
インポート可能な関数セット
関数セット | 機能 |
---|---|
:cgi | param(), path_into() のような, CGI を扱うすべてのメソッドをインポート |
:form | textfield() のようなフォームを作成するメソッドをインポート |
:html2 | HTML 2.0 標準要素を作成するすべてのメソッドをインポート |
:html3 | HTML 3.0 標準要素を作成するすべてのメソッドをインポート ( <table>, <super>, <sub> 等 ) |
:html4 | HTML 4 標準要素を作成するすべてのメソッドをインポート ( <abbrev>, <acronym>, <thead> 等 ) |
:netscape | <blink>, <fontsize>, <center> タグをインポート |
:html | すべての HTML 作成のためのショートカット ( html2, html3, html4, netscape ) をインポート |
:standard | 標準の機能 ( html2, html3, html4, from, cgi ) をインポート |
:all | 利用可能なすべてのメソッドをインポート ( 全リストは CGI.pm のコード中にある %EXPORT_TAGS で定義 ) |
CGI.pm の %EXPORT_TAGS は次の通り。ソースコードの 225 - 254 行目。
%EXPORT_TAGS = (
':html2'=>['h1'..'h6',qw/p br hr ol ul li dl dt dd menu code var strong em
tt u i b blockquote pre img a address cite samp dfn html head
base body Link nextid title meta kbd start_html end_html
input Select option comment charset escapeHTML/],
':html3'=>[qw/div table caption th td TR Tr sup Sub strike applet Param nobr
embed basefont style span layer ilayer font frameset frame script small big Area Map/],
':html4'=>[qw/abbr acronym bdo col colgroup del fieldset iframe
ins label legend noframes noscript object optgroup Q
thead tbody tfoot/],
':netscape'=>[qw/blink fontsize center/],
':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/],
':cgi'=>[qw/param upload path_info path_translated request_uri url self_url script_name
cookie Dump
raw_cookie request_method query_string Accept user_agent remote_host content_type
remote_addr referer server_name server_software server_port server_protocol virtual_port
virtual_host remote_ident auth_type http append
save_parameters restore_parameters param_fetch
remote_user user_name header redirect import_names put
Delete Delete_all url_param cgi_error/],
':ssl' => [qw/https/],
':cgi-lib' => [qw/ReadParse PrintHeader HtmlTop HtmlBot SplitParam Vars/],
':html' => [qw/:html2 :html3 :html4 :netscape/],
':standard' => [qw/:html2 :html3 :html4 :form :cgi/],
':push' => [qw/multipart_init multipart_start multipart_end multipart_final/],
':all' => [qw/:html2 :html3 :netscape :form :cgi :internal :html4/]
);
新しい HTML タグ
CGI.pm では、急速に発展する HTML に対して、CGI.pm 自体のバージョンアップを待たなくて済む様に、CGI.pm に含まれない関数名のインポートを可能としています。
CGI.pm に含まれない関数名をインポートすると、それは新しい HTML タグとして適切に処理されます。
perldoc.jp の例では、タグ <gradient> が新たに追加されたとして、以下のコードを例示しています。
use CGI qw/:standard :html3 gradient/;
print gradient({-start=>'red',-end=>'blue'});
1 行目の関数 ( シンボル ) のインポートで、「 gradient 」を指定していることに注目します。これは、CGI.pm の一部ではありません。
2 行目の print では、タグ <gradient> の仕様に従って開始・終了のカラーをしています。
これを実行すると次の結果が得られます。
<gradient end="blue" start="red" />
gradient がタグとして機能していることが分かります。
ちなみに、CGI.pm は、実行スピードの観点から、読み込む関数 ( シンボル ) を指定する場合に、Export の書式を使わないそうですが、将来的には変更される可能性があるとのことです。
0xb1 -> 0xb2 へ
次回も引き続きモジュール CGI.pm を確認します。
該当のドキュメントが、基本的にオブジェクト指向スタイルを前提に説明されているので、当 blog での確認もこれに準じます。
参考情報は以下の書籍を中心に Wikipedia および各 Web サイト。それと詳しい先輩。
参考 :「Randal L. Schwartz, brian d foy, Tom Phoenix 共著 近藤 嘉雪 訳「初めての Perl 第 6 版」(オライリー・ジャパン発行 ISBN978-4-87311-567-2)」
次回 (0xb2) へ続く。
目次 - 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)