Perl Perl_1
Perl 「 モジュール 」CGI.pm 名前の衝突と独自の名前 (0xb3)

目次 - Perl Index
Theme
Perl について、復習を兼ねて断片的な情報を掲載して行く連載その 0xb3 回。
Perl モジュール CGI.pm の、名前の衝突と独自の名前の引数名を確認する。
Perl 「 モジュール 」CGI.pm オブジェクト指向スタイル (0xb0)
Perl 「 モジュール 」CGI.pm 関数指向スタイル (0xb1)
Perl 「 モジュール 」CGI.pm HTML ショートカット (0xb2)
-w スイッチ ( またはプラグマ warnings ) を利用している場合、CGI.pm の引数名と Perl 組込みの関数名の、名前の衝突に対する警告が発生する場合があると言います。
多くの場合、これは「 -value 」という引数名が原因です。
-value は、複数の値を持つメニュー「 multi-valued menu 」やラジオボタン「 radio button 」、クラスター「 cluster 」等を生成する引数です。
この -w スイッチ ( またはプラグマ warnings ) による、名前衝突の警告を回避するには次の様な選択肢があります。
1. 他の名前があればそれを使う ( e.g. -value は -values の別名 )。
2. 先頭を大文字にする ( e.g. -Value )。
3. 引数名をクォートで囲む ( e.g. '-value' )。
CGI.pm のルーチンは、ルーチン自身が知らない引数名を与えられたとしても、何かしら有効とする処理を行います。
これは、(0xb1) で確認した新しい HTML タグを生成することに少し似ています。
ルーチン header を例にすると次の様になります。
まず、通常ルーチン header は次の様に動作します。
実行結果は次の通りです。
次に、ルーチン header が知らない独自の引数名と値を与えてみます。
これは次の様に、標準でないヘッダを生成します。
なお、perldoc の例示では 1 行目に「 HTTP/1.0 200 OK 」の記述がありますが、上記コードの実行だけでは同記述は出力されませんでした。
また、コード中では引数名にアンダースコア ( _ ) を指定していますが、アンダースコアはすべてハイフン ( - ) として出力されることに注意しましょう。
これは、HTTP および HTML の標準を追随する場合に有用とのことです。
次の文は「 ( POST と GET メソッドの両方からの ) 入力を解析し、$query と呼ばれる perl5 オブジェクトに格納する 」と言います。
スカラ変数 $query を print で出力すると、次の結果が得られました。
再びデバッガ ( (0x95) ) の出番です。
Perl デバッガを利用して、$query の中身を出力した結果は次の通りです。
ん ? これは (0xb0) の「 オブジェクトの中身 」で確認したものとまったく同じの様に見えます。
(0xb0) の場合は「 $q = CGI->new 」と書き、今回は「 $query = new CGI 」と書きました。
リファレンスやオブジェクトについて、ほぼ無知の僕にとって、これは混乱の原因になる展開です。
しかしながら、いずれの場合も、新しい CGI オブジェクトを生成していることに変わりありません。
# perldoc.jp のページをよくよく見てみると、ページ右上に位置する参照モジュールのドキュメントバージョンが「 2.89 」になっていました。
# つまり、「 $query = new CGI 」は、CGI.pm の Ver 2.89 の書き方で「 $q = CGI->new 」は Ver 3.49 の書き方だということです。
# 僕が利用しているのは Ver 3.65 で、日本語訳はまだ存在しませんが、perldco で見る限り「 $q = CGI->new 」の書き方を使う様です。
# しかしながら、どちらの書き方でも動きそうな雰囲気です。また、書き方の違いにある意味はまだ理解出来ていません。
# ちなみに、現在の最新版は Ver 4.00 です。
次回も引き続き CGI.pm を確認します。
参考情報は以下の書籍を中心に Wikipedia および各 Web サイト。それと詳しい先輩。
参考 :「Randal L. Schwartz, brian d foy, Tom Phoenix 共著 近藤 嘉雪 訳「初めての Perl 第 6 版」(オライリー・ジャパン発行 ISBN978-4-87311-567-2)」
次回 (0xb4) へ続く。
目次 - Perl Index
Perl 「 モジュール 」CGI.pm 関数指向スタイル (0xb1)
Perl 「 モジュール 」CGI.pm HTML ショートカット (0xb2)
Perl 組込み関数との名前の衝突
-w スイッチ ( またはプラグマ warnings ) を利用している場合、CGI.pm の引数名と Perl 組込みの関数名の、名前の衝突に対する警告が発生する場合があると言います。
多くの場合、これは「 -value 」という引数名が原因です。
-value は、複数の値を持つメニュー「 multi-valued menu 」やラジオボタン「 radio button 」、クラスター「 cluster 」等を生成する引数です。
この -w スイッチ ( またはプラグマ warnings ) による、名前衝突の警告を回避するには次の様な選択肢があります。
1. 他の名前があればそれを使う ( e.g. -value は -values の別名 )。
2. 先頭を大文字にする ( e.g. -Value )。
3. 引数名をクォートで囲む ( e.g. '-value' )。
独自の引数名を利用する
CGI.pm のルーチンは、ルーチン自身が知らない引数名を与えられたとしても、何かしら有効とする処理を行います。
これは、(0xb1) で確認した新しい HTML タグを生成することに少し似ています。
ルーチン header を例にすると次の様になります。
まず、通常ルーチン header は次の様に動作します。
my $q = CGI->new;
print $q->header;
実行結果は次の通りです。
Content-Type: text/html; charset=ISO-8859-1
次に、ルーチン header が知らない独自の引数名と値を与えてみます。
my $q = CGI->new;
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
なお、perldoc の例示では 1 行目に「 HTTP/1.0 200 OK 」の記述がありますが、上記コードの実行だけでは同記述は出力されませんでした。
また、コード中では引数名にアンダースコア ( _ ) を指定していますが、アンダースコアはすべてハイフン ( - ) として出力されることに注意しましょう。
これは、HTTP および HTML の標準を追随する場合に有用とのことです。
問い合せオブジェクトの作成
次の文は「 ( POST と GET メソッドの両方からの ) 入力を解析し、$query と呼ばれる perl5 オブジェクトに格納する 」と言います。
$query = new CGI;
スカラ変数 $query を print で出力すると、次の結果が得られました。
CGI=HASH(0x8001f8)
再びデバッガ ( (0x95) ) の出番です。
Perl デバッガを利用して、$query の中身を出力した結果は次の通りです。
DB<1> x \$query
0 REF(0x81eaa8)
-> CGI=HASH(0xf5a7b8)
'.charset' => 'ISO-8859-1'
'.fieldnames' => HASH(0xde3708)
empty hash
'.parameters' => ARRAY(0xfa9038)
empty array
'escape' => 1
'param' => HASH(0xcb0898)
empty hash
'use_tempfile' => 1
DB<2>
ん ? これは (0xb0) の「 オブジェクトの中身 」で確認したものとまったく同じの様に見えます。
(0xb0) の場合は「 $q = CGI->new 」と書き、今回は「 $query = new CGI 」と書きました。
リファレンスやオブジェクトについて、ほぼ無知の僕にとって、これは混乱の原因になる展開です。
しかしながら、いずれの場合も、新しい CGI オブジェクトを生成していることに変わりありません。
# perldoc.jp のページをよくよく見てみると、ページ右上に位置する参照モジュールのドキュメントバージョンが「 2.89 」になっていました。
# つまり、「 $query = new CGI 」は、CGI.pm の Ver 2.89 の書き方で「 $q = CGI->new 」は Ver 3.49 の書き方だということです。
# 僕が利用しているのは Ver 3.65 で、日本語訳はまだ存在しませんが、perldco で見る限り「 $q = CGI->new 」の書き方を使う様です。
# しかしながら、どちらの書き方でも動きそうな雰囲気です。また、書き方の違いにある意味はまだ理解出来ていません。
# ちなみに、現在の最新版は Ver 4.00 です。
0xb3 -> 0xb4 へ
次回も引き続き CGI.pm を確認します。
参考情報は以下の書籍を中心に Wikipedia および各 Web サイト。それと詳しい先輩。
参考 :「Randal L. Schwartz, brian d foy, Tom Phoenix 共著 近藤 嘉雪 訳「初めての Perl 第 6 版」(オライリー・ジャパン発行 ISBN978-4-87311-567-2)」
次回 (0xb4) へ続く。
目次 - 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)