wonder on server side

 : on twitter

[perl]CGIモジュール

with 2 comments

perlのフォーム作成をお手伝いするにあたって、CGIモジュールを知らないとだめでした。

CGIモジュールができること

主なもので、

  • httpヘッダーの出力
  • HTMLの生成
  • フォームタグの生成
  • queryの取得

主に、フォーム周りですね。
queryをとって、出力するっていう一通りの事ができそうです。

CGIモジュールを使う

モジュールは読み込んで、インスタンス化する。

use strict;
use warnings;

use CGI;

$html = new CGI();

httpヘッダーの出力

httpヘッダーを出力します。

print $html->header();

headerメソッドを使ってhttpヘッダーを取得しprint関数で出力します。
引数を指定せずに出力すると

Content-Type: text/html; charset=ISO-8859-1

になります。
文字コード等を変更したいときは引数にハッシュ形式で指定します。

print $html->header(-charset => 'utf-8');
# Content-Type: text/html; charset=utf-8

引数のkey値の頭に「-」をつけます。注意。
指定できる引数は他にも多数あります。
指定したい分だけ引数に指定します。
主なものとして、

-type : Content-typeの設定
-charset : 文字コードの設定
-status : 返すステータスコードの設定
-cookie : クッキーの設定

等です。
また、リダイレクトしたい場合はリダイレクションヘッダーを返すこともできます。

print $html->redirect('http://hoge.com');

redirectメソッドの引数にurlを指定することで、そのアドレスへリダイレクトします。

HTMLの生成

CGIクラスのメソッドを使うといくつかのHTMLタグを生成することができます。

【htmlの最初と最後を生成】

print $html->start_html(); # body開始タグまでを生成
print $html->end_html(); # body終了タグからhtml終了タグまで生成

# 出力結果
# <!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>Untitled Document</title>
# <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
# </head>
# <body>
#
# /body>
# </html>

と、なります。
タイトルタグは引数で指定できます。

print $html->start_html(-title=>'タイトルだよ');

# 前後省略
# <title>タイトルだよ</title>

【各HTMLタグを生成】

主なHTMLタグについてはメソッドを使って生成することができます。

タグ名(属性値(ハッシュ),内容);

第一引数にはハッシュ形式で属性値を指定します。
第二引数にはタグの中身を入れます。

print $html->h1({-class=>'hoge'},'メインタイトル');
# 出力結果
# <h1 class="hoge">メインタイトル</h1>

style属性とかもつけることができます。

print $html->h1({-style=>'color:#cc0000'},'メインタイトル');
# 出力結果
# <h1 style="color:#cc0000">メインタイトル</h1>

属性値を指定するハッシュ引数には、まったく関係のない属性値を指定しても生成されます。
エラーにはならないようなので注意が必要ですね。

print $html->h1({-idid=>'hoge'},'メインタイトル');
# 出力結果
# <h1 idid="hoge">メインタイトル</h1>
# エラーにはならず生成されてしまう

第一引数を省略すると属性値がないHTMLタグが生成されます。

print $html->h1('メインタイトル');
# 出力結果
# <h1>メインタイトル</h1>

ul等のタグをネストしたい時は引数にネストしたいタグメソッドを書きます。

print $html->ul(
              $html->li('リスト1'),
              $html->li('リスト2')
);
# 出力結果
# <ul><li>リスト1</li><li>リスト2</li></ul>

ただ、HTMLに限って言えばCGIモジュールで生成するよりは
テンプレートを読み込んだほうがよさそうです。
部分的にHTMLを動的生成したいときなんかはよさそうです。

フォームタグの出力

【formの最初と最後を生成】

まず、htmlタグの時と同じようにフォームタグの最初と最後を生成します。

print $html->start_form(); # form開始タグを生成
print $html->end_form(); # form終了タグを生成

# 出力結果
# <form method="post" action="#" enctype="multipart/form-data">
# </form>

start_htmlに何も引数を指定しないと上記のようなソースが生成されます。
actionは自分自身のファイルを指します。

start_htmlの引数にハッシュ形式の値を渡すことで属性値を変更できます。

print $html->start_form(
                                 -method=>'post',
                                 -action=>'hoge/fuga.cgi'
);
# 出力結果
# <form method="post" action="hoge/fuga.cgi" enctype="multipart/form-data">
# </form>

【各フォーム関連タグを生成】

通常のタグと生成方法は同じ。各メソッドに属性値の引数を入れてタグを生成します。
例えば、テキストフィールドだと、

print $html->textfield(
                              -name=>'address',
                              -default=>'入力してください。',
                              -size=>'20',
                              -class=>'text01',
);
# 出力結果
# <input type="text" name="address" value="入力してください。" size="20" class="text01" />

通常、key値と属性値の名前は一緒ですが、valueについてはdefaultになるので注意ですね。
それから、onclick等のイベントハンドラも追加できます。

print $html->textfield(
                              -name=>'address',
                              -default=>'入力してください。',
                              -size=>'20',
                              -class=>'text01',
                              -onclick=>'fuga()'
);
# 出力結果
# <input type="text" name="address" value="入力してください。" size="20" onclick="fuga()" class="text01" />

その他のタグも基本的には同じ方法で生成します。

print $html->textarea(-name=>'hoge'); # テキストエリア
print $html->password_field(-name=>'hoge'); # パスワードフィールド
print $html->filefield(-name=>'hoge'); # ファイルアップロード用
print $html->popup_menu(-name=>'hoge'); # セレクトタグ
print $html->checkbox_group(-name=>'hoge'); # チェックボックスグループ
print $html->radio_group(-name=>'hoge'); # ラジオボックスグループ
print $html->submit(-name=>'hoge'); # 送信ボタン

セレクトタグや、チェックボックスグループ、ラジオボックスグループ等は引数のハッシュに値を配列で入れることでタグを複数生成します。

print $html->popup_menu(
                                    -name=>'list01',
                                    -values=>['one','two','three'],
                                    -defalut=>'two'

);

selectedはdefaultに設定した値につきます。
その他詳しくは以下のページをどうぞ。

CGIモジュール – [Perl講座 - Smart]

queryの取得

CGIモジュールはqueryを取得できます。
paramメソッドの引数に取得したいフォームのname値を入れます。

my $query = $html->param('hoge');

リストやチェックボックスのような複数の値が入る場合は受け取る変数をリストにします。

my @query = $html->param('listname');

引数をいれずに実行すると、受け取ったqueryのnama値がリストで入ります。
値ではないので注意です。

my @queryname = $html->param();

まとめ

どうやらCGIモジュールは割りと使われるみたいですね。
perl 5.x では標準で組み込まれているようです。

フォーム関連の動作が一通りできるようなので、便利です。

また、CGIモジュールではほとんどのメソッドがprint関数で出力するので、以下のような書き方が良いみたいです。

print $html->header,
       $html->start_html,
       $html->h1('メインタイトル'),
       $html->end_html;

インデントを揃えることで見やすくなります。
ちょっとpythonぽくもありますが。
ぜひどうぞ。

参考サイト

CGIモジュール – [Perl講座 - Smart]
CGI.pmを使ってみよう – futomi’s Cafe
CGI – 簡単なCGI(Common Gateway Interface)クラス

Written by wonder-boys

11月 9th, 2009 at 7:31 pm

Posted in module, perl

Tagged with

2 Responses to '[perl]CGIモジュール'

Subscribe to comments with RSS or TrackBack to '[perl]CGIモジュール'.

  1. すごい・・・。
    そんなにまじめに勉強したことない・・・。

    lax

    9 11月 09 at 11:03 PM

  2. やっぱり、一通りやらないと追いつけませんから。

    wonder-boys

    10 11月 09 at 9:54 PM

Leave a Reply