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 名前の衝突と独自の名前 (0xb3)

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)


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)の記事
 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 ▲