Perl Perl_1
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)
「 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 ヘッダを出力します。
もう 1 つは「 関数指向スタイル 」で、オブジェクトメソッドと同じ機能を関数として利用します。
関数指向スタイルでは、ソースコードの名前空間に CGI.pm が提供する関数のセット ( 通常は standard ) をインポートする必要があります。
また、関数指向スタイルでは、暗黙のオブジェクトが生成されますが、これは 1 度に 1 つしか利用出来ません。
次の例は、関数の standard セットをインポートして HTML ヘッダを出力します。
関数指向スタイルでインポート可能な関数セットは (0xb1) で確認しました。
HTML が急速に発展していることを CGI.pm は知っています。
このため、CGI.pm は自信に含まれない関数のサポートを提供しています。これは、新しい HTML タグを生成出来ることを意味します。
次の例では、実際には存在しない HTML タグ「 <gradient> 」を生成します。「 use CGI 」の行で、「 gradient 」をインポートしていることに注目します。
この記述によって、次の出力が得られます。
次の様にコンテンツを指定すれば、
コンテンツを含む出力が得られます。
HTML ショートカットは、HTML タグを生成するためのルーチン ( メソッド/関数 )です。
HTML ショートカットは、引数を取ることが出来ますが、引数には名前を付けることが出来ます。
通常引数の名前の前には、次の様に「 - 」を付与して記述しますが、実際は最初の引数にのみ「 - 」を指定すれば、残りの引数名はモジュール側でよしなに理解します。
次の例では、「 type 」と「 expires 」が引数名です。
引数が 1 つの場合、引数名は不要です。それは、ルーチンのデフォルトの引数 ( header() なら ドキュメントタイプ ) として認識します。
CGI.pm のルーチンは、必要に応じて自動的に生成されます。つまり、HTML タグを動的に生成します。
HTML タグはアトリビュート ( attribute ) とコンテンツ ( contents ) を持ちます。
アトリビュートはタグの中の「 attribute="value" 」のペアで、コンテンツはオープンとクローズのタグのペアに挟まれた部分を指します。
CGI.pm はアトリビュートとコンテンツを区別するための規則を持っています。
アトリビュートは、ハッシュリファレンスとして最初の引数に指定します。もし続けて引数があれば、それをコンテンツと判断します。
これはアトリビュートもコンテンツも持たない次のタグを出力します。
次の例は 2 つの引数を与えています。
しかしながら、最初の引数がハッシュでないことに注目します。つまりこれは、次の様にコンテンツのみを持つタグを出力します。
次の例は 1 つの引数を与えています。
引数が太い矢印「 => 」を利用したハッシュで指定されていることから、これはアトリビュートとして判断され次の出力が得られます。
次の例は、最初の引数をハッシュで、続く引数を文字列で指定しています。
つまり、これは次の様に、アトリビュートとコンテンツを持ったタグを出力します。
-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 」と言う不明な引数名を与えます。
この場合は次の出力が得られます。引数名のアンダーバー ( _ ) がハイフン ( - ) に変更されていることにも注目します。
軽い気持ちで復習を始めましたが、思っていたよりもずっとボリュームがありました。
次回も引き続き CGI.pm の復習を継続します。
参考情報は以下の書籍を中心に Wikipedia および各 Web サイト。それと詳しい先輩。
参考 :「Randal L. Schwartz, brian d foy, Tom Phoenix 共著 近藤 嘉雪 訳「初めての Perl 第 6 版」(オライリー・ジャパン発行 ISBN978-4-87311-567-2)」
次回 (0xbe) へ続く。
目次 - Perl Index
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 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)