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_1

Perl 「 モジュール 」CGI.pm 復習 その 1 (0xbd)

Perl 「 モジュール 」CGI.pm 復習 その 1  (0xbd)

目次 - Perl Index


Theme



Perl について、復習を兼ねて断片的な情報を掲載して行く連載その 0xbd 回。

Perl モジュール CGI.pm の確認を再開するにあたり、これまで確認した内容を復習する。その 1。


Perl 「 モジュール 」CGI.pm Introduction (0xaf)
Perl 「 モジュール 」CGI.pm オブジェクト指向スタイル (0xb0)
Perl 「 モジュール 」CGI.pm 関数指向スタイル (0xb1)
Perl 「 モジュール 」CGI.pm HTML ショートカット (0xb2)
Perl 「 モジュール 」CGI.pm 名前の衝突と独自の名前 (0xb3)
Perl 「 モジュール 」CGI.pm ファイルハンドルとオブジェクトの初期化 (0xb4)
Perl 「 モジュール 」CGI.pm キーワードとパラメータ名のリスト (0xb5)
Perl 「 モジュール 」CGI.pm value の取り出し/変更/追加等 (0xb6)


Introduction



「 Common Gateway Interface 」を略して「 CGI 」と呼びます。

CGI は、共通の ( common ) 出入口の ( gateway ) 接点 ( interface ) を提供することで Web サーバと他のプログラムを連携させることを可能とし、これにより "動的" なデータ生成とその送出、例えば掲示板やアクセスカウンタ、ブログシステム等が実現出来ます。

CGI は、"環境変数" や "標準入出力" を扱える範囲でプログラミング言語を限定しません。

 + CGI プログラムはクライアントのリクエストから Web サーバがコールする
 + CGI プログラムへの入力はコマンドライン引数や環境変数・標準入出力経由で行われる
 + CGI プログラムが送出するデータは Web サーバ経由でクライアントに送信される
 + CGI プログラムは多くの場合入力に応じた HTML を生成・出力する

Perl モジュール CGI.pm は、Perl による CGI プログラムの記述をサポートします。

CGI.pm は、Perl 標準モジュールに組み込まれているため、別途インストールすることなく利用を開始出来ます。

CGI.pm のドキュメントは、コマンドライン上で「 perldoc CGI 」または「 perldoc CGI.pm 」とタイプするか、 ( 最近頻繁に落ちている ) オンラインの The CPAN Search Site で確認出来ます。

また、オンラインの perldoc.jp には日本語翻訳済みのドキュメントがあります。


プログラミングスタイル



モジュール CGI.pm は、2 つのプログラミングスタイルを提供しています。

1 つは「 オブジェクト指向スタイル 」で、これは、1 つ以上の「 オブジェクト 」を作成し「 オブジェクトメソッド 」を利用して処理を行います。

オブジェクト指向スタイルでは、1 度に複数のオブジェクトを生成して、各オブジェクトの状態を保持しながら利用することが出来ます。

次の例は、オブジェクト $q を生成し、HTML ヘッダを出力します。


use CGI; # load CGI routines

my $q = CGI->new; # create new CGI object
print $q->header, # create the HTTP header
$q->start_html('hello world'), # start the HTML
$q->h1('hello world'), # level 1 header
$q->end_html; # end the HTML


もう 1 つは「 関数指向スタイル 」で、オブジェクトメソッドと同じ機能を関数として利用します。

関数指向スタイルでは、ソースコードの名前空間に CGI.pm が提供する関数のセット ( 通常は standard ) をインポートする必要があります。

また、関数指向スタイルでは、暗黙のオブジェクトが生成されますが、これは 1 度に 1 つしか利用出来ません。

次の例は、関数の standard セットをインポートして HTML ヘッダを出力します。


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


関数指向スタイルでインポート可能な関数セットは (0xb1) で確認しました。


新しい HTML タグの生成



HTML が急速に発展していることを CGI.pm は知っています。

このため、CGI.pm は自信に含まれない関数のサポートを提供しています。これは、新しい HTML タグを生成出来ることを意味します。

次の例では、実際には存在しない HTML タグ「 <gradient> 」を生成します。「 use CGI 」の行で、「 gradient 」をインポートしていることに注目します。


use CGI qw/:standard :html3 gradient/;
print gradient({-start=>'red',-end=>'blue'});


この記述によって、次の出力が得られます。


<gradient end="blue" start="red" />


次の様にコンテンツを指定すれば、


use CGI qw/:standard :html3 gradient/;
print gradient({-start=>'red',-end=>'blue'},'contents');


コンテンツを含む出力が得られます。


<gradient end="blue" start="red">contents</gradient>



HTML ショートカット



HTML ショートカットは、HTML タグを生成するためのルーチン ( メソッド/関数 )です。

HTML ショートカットは、引数を取ることが出来ますが、引数には名前を付けることが出来ます。

通常引数の名前の前には、次の様に「 - 」を付与して記述しますが、実際は最初の引数にのみ「 - 」を指定すれば、残りの引数名はモジュール側でよしなに理解します。

次の例では、「 type 」と「 expires 」が引数名です。


print $q->header(-type=>'image/gif',-expires=>'+3d');


引数が 1 つの場合、引数名は不要です。それは、ルーチンのデフォルトの引数 ( header() なら ドキュメントタイプ ) として認識します。


HTML タグの生成



CGI.pm のルーチンは、必要に応じて自動的に生成されます。つまり、HTML タグを動的に生成します。

HTML タグはアトリビュート ( attribute ) とコンテンツ ( contents ) を持ちます。

アトリビュートはタグの中の「 attribute="value" 」のペアで、コンテンツはオープンとクローズのタグのペアに挟まれた部分を指します。

CGI.pm はアトリビュートとコンテンツを区別するための規則を持っています。

アトリビュートは、ハッシュリファレンスとして最初の引数に指定します。もし続けて引数があれば、それをコンテンツと判断します。


print $q->h1();


これはアトリビュートもコンテンツも持たない次のタグを出力します。


<h1 />


次の例は 2 つの引数を与えています。


print $q->h1('some','contents');


しかしながら、最初の引数がハッシュでないことに注目します。つまりこれは、次の様にコンテンツのみを持つタグを出力します。


<h1>some contents</h1>


次の例は 1 つの引数を与えています。


print $q->h1({-align=>'left'});


引数が太い矢印「 => 」を利用したハッシュで指定されていることから、これはアトリビュートとして判断され次の出力が得られます。


<h1 align="left" />


次の例は、最初の引数をハッシュで、続く引数を文字列で指定しています。


print $q->h1({-align=>'left'},'contents');


つまり、これは次の様に、アトリビュートとコンテンツを持ったタグを出力します。


<h1 align="left">contents</h1>



名前の衝突



-w スイッチまたは warnings プラグマを有効にした状態では、CGI.pm の引数名と Perl 組込みの関数名が同名であることに起因する警告 ( 名前の衝突 ) が発生する場合があります。

多くの場合、これは CGI.pm の「 -vaule 」という引数名が原因ですが、次の対応方法があります。

 1. 他の名前があればそれを使う ( e.g. -value は -values の別名 )
 2. 先頭を大文字にする ( e.g. -Value )
 3. 引数名をクォートで囲む ( e.g. '-value' )


独自の引数名の利用



CGI.pm の各ルーチンは、ルーチン自身が知らない引数名に対しても、適切な処理を行う様試みます。

例えば、 header() に対して「 cost, annoyance_level, complaians_to 」と言う不明な引数名を与えます。


print $q->header( -type => 'text/html', # タイプ
-cost => 'Three smackers', # コスト
-annoyance_level => 'high', # 迷惑レベル
-complaints_to => 'bit bucket'); # 苦情は..


この場合は次の出力が得られます。引数名のアンダーバー ( _ ) がハイフン ( - ) に変更されていることにも注目します。


Cost: Three smackers
Annoyance-level: high
Complaints-to: bit bucket
Content-Type: text/html; charset=ISO-8859-1



0xbd -> 0xbe へ



軽い気持ちで復習を始めましたが、思っていたよりもずっとボリュームがありました。

次回も引き続き CGI.pm の復習を継続します。

参考情報は以下の書籍を中心に Wikipedia および各 Web サイト。それと詳しい先輩。

参考 :「Randal L. Schwartz, brian d foy, Tom Phoenix 共著 近藤 嘉雪 訳「初めての Perl 第 6 版」(オライリー・ジャパン発行 ISBN978-4-87311-567-2)」


次回 (0xbe) へ続く。

目次 - 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 ▲