概要
CGI.pmは、簡単にHTMLページを生成し、その内容を解析するためのPerl標準ライブラリです。
このライブラリのメソッドを使って、フォームから送信されたデータをチェックしたり、その値を使ってフォームを作成するといったようなことが出来ます。また、ファイルのアップロード、スタイルシート、サーバ・プッシュなどを実現する機能も用意されています。
CGI.pmはオブジェクト指向と、メソッド指向のプログラミング・スタイルがあります。このドキュメントでは、オブジェクト指向スタイルを使って説明していきます。
以下は、CGI.pmを使って、簡単なHTMLページを出力する例です。
# CGI.pmの読み込み
use CGI;
# 新しいCGIオブジェクトの作成
$obj = new CGI;
print $obj->header, # HTTPヘッダの作成
$obj->start_html('hello world'), "\n", # HTMLの開始
"hello world\n", # ボディ部分の出力
$obj->end_html; # HTMLの終わり
出力結果は以下のとおりです。
Content-Type: text/html; charset=ISO-8859-1
<?xml version="1.0" encoding="iso-8859-1"?>
<!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>hello world</title>
</head><body>
<h1>hello world</h1>
</body></html>
ブラウザでは、単純に次のように表示されます。
hello world
CGI.pmの使い方
CGI.pmの読み込み
はじめに、useを使って、CGI.pmを呼び出します。
use CGI;
次に、オブジェクトを作成します。
$obj = new CGI;
ここで作成したオブジェクト(上記では$obj)は、メソッド(関数)を呼ぶ際に使うことになります。詳細は後述をご覧ください。
メソッドの呼び出し方
オブジェクト指向でのメソッドの呼び出しは、newで作成したオブジェクトを使って、下記のように行います。
$obj->header();
CGI.pmに用意されたメソッドは、さまざまな引数を受け取ります。
このインターフェースを簡単にするため、すべてのメソッドは以下のような名前付き引数呼び出しスタイルを使います。
print $obj->header(-type=>'image/gif', -expires=>'+3d');
各引数の名前の前には、ハイフン( - )をつけます。実際は、最初の引数につけておけば、それ以降に続く引数はハイフン( -
)を省略することができます。引数リストでは、大文字・小文字の区別がないので、-type、-Type、-TYPEは同様の意味となります。また、どの順番に引数を指定しても、問題ありません。
名前付き引数の値には、必要であればスカラ以外にも、配列へのリファレンス、ハッシュへのリファレンスを指定できます。
例えば、paramメソッドは、ひとつの値と、複数の値を指定することができます。
$obj->param(-name=>'nickname',-value=>'gaki'); $obj->param( -name=>'nickname', -value=>['gaki','warumono','akuma','kenzo'] );
1つの引数だけを受け取るメソッドの場合、引数名なしに1つの引数を与えることが出来ます。
print $obj->header('text/html');
未定義のメソッド
CGI.pmには、定義していないメソッドを、必要に応じて自動的に生成する機能があります。
HTMLタグは、属性と内容を持ちます。たとえば、H1の属性としてalign=centerを指定し、内容として"table ofを指定する場合、以下のように表記します。
contents"
<h1 align=center>table of contents</h1>
CGI.pmで同様の出力を得るには、HTML属性をハッシュ・リファレンスで最初の引数、内容があればその後の引数として渡します。
h1({-align=>center}, 'table of contents');
属性を指定しない場合、内容を指定しない場合の表記の仕方と、その出力結果は以下のようになります。
| コード | 出力結果 |
|---|---|
| h1() | <H1> |
| h1('Level1', 'Header'); | <H1>Level 1 Header</H1> |
| h1({-align=>left}); | <H1 ALIGN="LEFT"> |
| h1({-align=>left}, 'Header'); | <H1 ALIGN="LEFT">Header</H1> |
開始タグと終了タグを出力するための詳細
HTMLタグを生成するメソッドのほとんどは、自動的に開始タグと終了タグを自動的に作成します。
print h1('Level 1 Header');
上記コマンドの出力は以下のようになります。
<H1>Level 1 Header</H1>
開始タグと終了タグを任意に出力したいような場合は、以下のようにstart_タグ名とend_タグ名の形式を使うことができます。
print start_h1, 'Level 1 Header', end_h1;
いくつかの例外を除いて、start_タグ名とend_タグ名メソッドはuse CGIしたときに自動的に作成されません。
以下のように、名前の前にアスタリスクを置くか、あるいは代わりにstart_タグ名またはend_タグ名を
指定する必要があります。
use CGI qw/:standard *table start_ul/;
上記では、start_table、end_table、start_ul、end_ulメソッドを作成します。
HTTPヘッダの出力機能
標準HTTPヘッダの出力
CGIでHTMLページを出力する際には、最初に標準HTTPヘッダを出力します。
headerメソッドを使って簡単に出力することができます。
print $obj->header;
出力結果は以下のとおりです。
Content-Type: text/html
名前付引数を使って、Content-Typeやcharset、expiresなど
さまざまな属性を指定することができます。理解されるパラメータは-type、-status、-expires、-cookieで、他の名前がついたパラメータはすべて、最初のハイフンを落とされて、ヘッダ・フィールドに変えられます
print $obj->header( -type=>'image/gif', -nph=>1, -status=>'402 Payment required', -expires=>'+1d', -cookie=>$cookie, -charset=>'utf-7', -attachment=>'foo.gif', );
出力結果は以下のとおりです。
HTTP/1.0 402 Payment required
Status: 402 Payment required
Set-Cookie:
Expires: Tue, 06 Mar 2001 09:26:31 GMT
Date: Sat, 03 Mar 2001 09:26:31 GMT
Attachment: foo.gif
Charset: utf-7
Content-Type: image/gif
HTMLドキュメントの出力機能
<HTML>、<HEAD>、<TITLE>、<BODY>タグの出力
start_htmlメソッドは、<HTML>、<HEAD>、<TITLE>、<BODY>タグを出力します。
なにも引数を指定しない場合は、下記のように<TITLE>タグや<BODY>タグはデフォルトの状態で出力されます。
print $obj->start_html;
出力結果は以下のとおりです。
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<HTML><HEAD><TITLE>Untitled Document</TITLE>
</HEAD><BODY>
引数に指定した場合です。
print $obj->start_html(-title=>'----', -BGCOLOR=>'#FFFFFF');
出力結果は以下のとおりで、<TITLE>タグとBGCOLOR属性に指定した値が挿入されています。
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<HTML><HEAD><TITLE>----</TITLE>
</HEAD><BODY BGCOLOR="#FFFFFF">
</BODY>、</HTML>タグの出力
end_htmlメソッドは、</BODY>、</HTML>タグを出力します。
print $obj->end_html;
出力結果は以下のとおりです。
</BODY></HTML>
基本HTMLタグの出力
CGI.pmは、メソッド名がそのまま出力するタグ名となっています。たとえば、<H1>タグを出力するには、h1メソッドを呼び出します。
print $obj->h1();
このような命名規則があるので、HTMLタグを出力したい際に、直感的にどのメソッドを呼び出せばよいかがわかると思います。メソッドの呼び出し同様、HTMLタグの属性と内容の指定も簡単です。HTML属性をハッシュ・リファレンスで最初の引数、内容があればその後の引数として渡します。
たとえば、H1の属性としてalign=centerを指定し、内容として"table ofを指定する場合、以下のように引数を渡します。
contents"
h1({-align=>center}, 'table of contents');
この出力は下記のとおりです。
<h1 align=center>table of contents</h1>
HTMLタグのネスティング
タグでタグを挟んだ状態をネスティングといいます。
<UL> <LI>リスト1</LI> <LI>リスト2</LI> </UL>
CGI.pmでネスティングを実現するには、次のようにメソッドの引数に、ネスティングしたいメソッドを指定します。
print $obj->ul(
$obj->li('リスト1'),
$obj->li('リスト1')
);
フォームタグの出力機能
start_form フォームの開始と終了
<FORM>タグの開始タグと終了タグは、start_formとend_formメソッドを使います。
print $obj->start_form( -method=>$method, -action=>$action, -enctype=>$encoding ); ... フォームの内容出力 ... print $obj->end_form;
start_formメソッドは<FORM>タグを返します。引数を指定しない場合の<FORM>タグ属性は下記のとおりです。
| 属性名称 | 属性の値 |
|---|---|
| method | POST |
| action | 呼び出し元スクリプト名 |
| enctype | application/x-www-form-urlencoded |
end_formは</FORM>タグを返します。
start_formには、JavaScript用に、-nameと-onSubmitパラメータが提供されています。-nameパラメータ
にはフォームの名前、-onSubmitにはJavaScript構文を指定できます。
textfield テキスト・フィールドの作成
テキスト入力フィールドの出力はtextfieldメソッドを使います。
print $obj->textfield( -name=>'フィールド名', -default=>'初期値', -size=>50, -maxlength=>80 );
出力結果は下記のとおりです。
<input type="text" name="フィールド名" value="初期値" size="50"
maxlength=
"80" />
名前付引数を使わずに、下記のようにも呼び出せます。
print $obj->textfield('フィールド名','初期値',50,80);
textfieldのパラメータは以下のとおりです。
| 引数名 | 内容 |
|---|---|
| -name | フィールド名(必須) |
| -default | フィールド内容の初期値 |
| -size | 文字数によるフィールドの大きさ |
| -maxlength | 最大文字数 |
上記のほか、JavaScript用に、-onChange、-onFocus、-onBlur、-onMouseOver、-onMouseOut、-onSelectパラメータが利用可能です。
フォームが処理されたとき、テキスト・フィールドの値は以下のように取り出すことが出来ます。
$value = $obj->param('foo');
そのほかのフィールド要素
textarea -複数行テキスト入力フィールドの作成
print $obj->textarea( -name=>'フィールド名', -default=>'初期値', -rows=>10, -columns=>50 );
出力結果は下記のとおりです。
<textarea name="フィールド名" rows="10" cols="50">初期値</textarea>
password_field -パスワード・フィールドの作成
print $obj->password_field( -name=>'フィールド名', -value=>'初期値', -size=>50, -maxlength=>80 );
出力結果は下記のとおりです。
<input type="password" name="フィールド名" value="初期値" size="50"
maxlen
gth="80" />
filefield -ファイル・アップロード・フィールドの作成
print $obj->filefield( -name=>'フィールド名', -default=>'初期値', -size=>50, -maxlength=>80 );
出力結果は下記のとおりです。
<input type="file" name="フィールド名" value="初期値" size="50"
maxlength=
"80" />
paramを呼ぶことによって、アップロードされたファイル名を取得することが出来ます。
$fh = $obj->param('フィールド名');
上記でparamが返す値は、ファイル・ハンドルでもあるので、そのまま読み込むことが可能です。
# テキストファイルを読み込み、出力
while (<$fh>) {
print;
}
uploadメソッドで取得するほうがより安全です。
$fh = $obj->upload('フィールド名');
while (<$fh>) {
print;
}
popup_menu -ポップアップ・メニューの作成
print $obj->popup_menu( -name=>'フィールド名', -values=>['eenie','meenie','minie'], -default=>'meenie', -labels=>\%labels);
出力結果は下記のとおりです。
<select name="フィールド名">
<option value="eenie">eenie</option>
<option selected="selected" value="meenie">meenie</option>
<option value="minie">minie</option>
</select>
名前付引数を使わずに、下記のようにも呼び出せます。
print $obj->popup_menu( 'フィールド名', ['eenie','meenie','minie'], 'meenie',\%labels);
popup_menuのパラメータは以下のとおりです。
| 引数名 | 内容 |
|---|---|
| -name | フィールド名(必須) |
| -value | メニュー要素(必須) |
| -default | デフォルトで選択されるメニュー要素名 |
| -labels | ラベル |
scrolling_list -スクローリング・リストの作成
print $obj->scrolling_list( -name=>'フィールド名', -values=>['eenie','meenie','minie','moe'], -default=>['eenie','moe'], -size=>5, -multiple=>'true', -labels=>\%labels);
出力結果は下記のとおりです。
<select name="フィールド名" size="5" multiple="multiple">
<option selected="selected" value="eenie">eenie</option>
<option value="meenie">meenie</option>
<option value="minie">minie</option>
<option selected="selected" value="moe">moe</option>
</select>
名前付引数を使わずに、下記のようにも呼び出せます。
print $obj->scrolling_list( 'フィールド名', ['eenie','meenie','minie','moe'], ['eenie','moe'],5,'true', \%labels);
scrolling_listのパラメータは以下のとおりです。
| 引数名 | 内容 |
|---|---|
| -name | フィールド名(必須) |
| -values | メニュー要素(必須) |
| -default | デフォルトで選択される値、もしくはその値が入ったリストへのリファレンス |
| -size | リストの大きさ |
| -multiple | 複数の選択を許可する場合は値にtrueを指定する |
| -labels | ラベル |
checkbox_group -チェックボックスのグループの作成
print $obj->checkbox_group( -name=>'グループ名', -values=>['eenie','meenie','minie','moe'], -default=>['eenie','moe'], -linebreak=>'true', -labels=>\%labels);
出力結果は下記のとおりです。
<input type="checkbox" name="グループ名" value="eenie"
checked="checked" />eenie<br />
<input type="checkbox" name="グループ名" value="meenie" />meenie<br />
<input type="checkbox" name="グループ名" value="minie" />minie<br/>
<input type="checkbox" name="グループ名" value="moe" checked="checked" />moe<br
/>
名前付引数を使わずに、下記のようにも呼び出せます。
print $obj->checkbox_group( 'グループ名', ['eenie','meenie','minie','moe'], ['eenie','moe'],'true',\%labels);
checkbox_groupのパラメータは以下のとおりです。
| 引数名 | 内容 |
|---|---|
| -name | フィールド名(必須) |
| -values | フィールドの値 |
| -default | デフォルトで選択される値、もしくはその値が入ったリストへのリファレンス |
| -linebreak | 改行 値を trueに設定するとチェックボックスの間に改行が入ります。 |
| -labels | ラベル |
checkbox -チェックボックスの作成
print $obj->checkbox( -name=>'フィールド名', -checked=>'checked', -value=>'ON', -label=>'CLICK ME');
出力結果は下記のとおりです。
<input type="checkbox" name="フィールド名" value="ON"
checked="checked" />CLICK ME
名前付引数を使わずに、下記のようにも呼び出せます。
print $obj->checkbox('checkbox_name','checked','ON','CLICK ME');
checkboxのパラメータは以下のとおりです。
| 引数名 | 内容 |
|---|---|
| -name | フィールド名(必須) |
| -checked | フィールドの状態 チェックボックスの状態をONにするには、値に checkedを指定します。 |
| -value | フィールドの値 |
| -label | ラベル |
radio_group -ラジオボタン・グループの作成
print $obj->radio_group( -name=>'グループ名', -values=>['eenie','meenie','minie'], -default=>'meenie', -linebreak=>'true', -labels=>\%labels);
出力結果は下記のとおりです。
<input type="radio" name="グループ名" value="eenie" />eenie<br
/>
<input type="radio" name="グループ名" value="meenie" checked="checked"
/>meenie<br/>
<input type="radio" name="グループ名" value="minie" />minie<br />
名前付引数を使わずに、下記のようにも呼び出せます。
print $obj->radio_group( 'グループ名', ['eenie','meenie','minie'], 'meenie','true',\%labels);
radio_groupのパラメータは以下のとおりです。
| 引数名 | 内容 |
|---|---|
| -name | フィールド名(必須) |
| -values | メニュー要素(必須) |
| -default | ONの状態にするラジオボタンの要素を指定可能 |
| -linebreak | 値をtrueに設定するとチェックボックスの間に改行が入ります。 |
| -labels | ラベル |
submit サブミット・ボタンの作成
print $obj->submit( -name=>'フィールド名', -value=>'value');
出力結果は下記のとおりです。
<input type="submit" name="フィールド名" value="value" />
名前付引数を使わずに、下記のようにも呼び出せます。
print $obj->submit('フィールド名','value');
submitのパラメータは以下のとおりです。
| 引数名 | 内容 |
|---|---|
| -name | ボタン上に表示されるラベル |
| -value | 問い合わせ文字列でスクリプトに渡される値 |
reset -リセット・ボタンの作成
print $obj->reset;
出力結果は下記のとおりです。
<input type="reset" />
defaults -デフォルト・ボタンの作成
print $obj->defaults('ラベル');
出力結果は下記のとおりです。
<input type="submit" name=".defaults" value="ラベル" />
hidden -ヒドゥン・フィールドの作成
print $obj->hidden( -name=>'フィールド名', -default=>['value1','value2']);
出力結果は下記のとおりです。
<input type="hidden" name="フィールド名" value="value1" /><input
type="hidden" name="フィールド名" value="value2" />
名前付引数を使わずに、下記のようにも呼び出せます。
print $obj->hidden('フィールド名','value1','value2');
hiddenのパラメータは以下のとおりです。
| 引数名 | 内容 |
|---|---|
| -name | フィールド名(必須) |
| -default | フィールドの値 1つの値、もしくはリストへのリファレンスを指定可能 |
image_button -クリッカブル・イメージ・ボタンの作成
print $obj->image_button( -name=>'フィールド名', -src=>'/source/URL', -align=>'MIDDLE');
出力結果は下記のとおりです。
<input type="image" name="フィールド名" src="/source/URL"
align="MIDDLE" />
名前付引数を使わずに、下記のようにも呼び出せます。
print $obj->image_button('フィールド名','/source/URL','MIDDLE');
image_buttonはクリッカブルなイメージを作成します。クリックされると、クリックの位置がスクリプトへbottun_name.xとbutton_name.yとして返されます。button_nameのところはそれに指定した名前です。
image_buttonのパラメータは以下のとおりです。
| 引数名 | 内容 |
|---|---|
| -name | フィールド名(必須) |
| -src | URL |
| -align | TOP/BOTTOM/MIDDLEを指定可能 |
このボタンの値は以下のようにして取得できます
$x= $obj->param('button_name.x');$y= $obj->param('button_name.y');
button -JAVASCRIPTアクション・ボタンの作成
print $obj->button( -name=>'フィールド名', -value=>'user visible label', -onClick=>"do_something()");
出力結果は下記のとおりです。
<input type="button" name="フィールド名" value="user visible
label" onclick="do_something()" />
名前付引数を使わずに、下記のようにも呼び出せます。
print $obj->button('フィールド名',"do_something()");
フォームからデータを受け取る機能
フォームフィールドのデータを取得する
フォームに入力・選択された値を取得する方法を、以下のフォームを例にしたがって説明します。
<form method="POST" action="post.cgi">
<p>ニックネーム<input type="text" name="nickname" size="20"></p>
<p>リスト<br>
<select size="3" name="list" multiple>
<option value="1">LIST1</option>
<option value="2">LIST2</option>
<option value="3">LIST3</option>
</select></p>
<p><input type="submit" value="送信"></p>
送信されたフォームの値を取得するには、paramメソッドの引数に必要なフォームフィールドの名称を指定します。
# フォームフィールド名 nickname の値を取得
$nickname = $obj->param('nickname');
複数選択可能なフォームであるチェックボックスやセレクトボックスを取得するには、以下のようにリストコンテキストにするだけです。
# フォームフィールド名 list の値を取得
@list = $obj->param('list');
フォームフィールドのすべての名前を受け取るには、paramメソッドに引数を与えないでリストコンテキストにするだけです。
@name = $obj->param;
配列@nameには、"nickname"、"list"という2つの要素が格納されます。