CGIモジュールの基礎2
■この章で解説するモジュール
CGI (header)
■この章でできること
・名前付きパラメータを使う
・HTTPヘッダを出力する

 CGIモジュールの基礎1ではCGIモジュールを使ったCGIスクリプトの基本を解説しました。ここではメソッドへのパラメータの指定方法を解説します。

 では、まずはサンプルを見てみましょう。

#!/usr/bin/perl

#############################################
# CGIのサンプル4
# Author: "Perl Programming Tips"
#############################################

use CGI qw/:standard/;

print header('text/html', '200 OK');
print start_html('Hello');
print h1('Hello');
print end_html();

 (実行結果はここをクリック)

 headerメソッドに明示的にパラメータを渡しています。headerメソッドの第一引数はHTTPヘッダに出力するコンテンツタイプ、第二引数にはステータスコードと説明文を指定します。(デフォルトで上のサンプルで指定している値になるので、特に指定する必要はありませんが、ここでは説明のために指定しています。)

 この指定の仕方は関数の引数などと同じなので特に珍しくはないですね。この方法ではパラメータを記述する場所によってパラメータが区別されています。これに対して、パラメータ名を明示することによってパラメータを渡す方法があります。これは「名前付きパラメータ」と呼ばれます。次のサンプルを見てください。

#!/usr/bin/perl

#############################################
# CGIのサンプル5
# Author: "Perl Programming Tips"
#############################################

use CGI qw/:standard/;

print header(-type=>'text/html', -status=>'200 OK');
print start_html(-title=>'Hello');
print h1('Hello');
print end_html();

 (実行結果はここをクリック)

 headerメソッドのパラメータに「-type=>」というような指定をしています。これが名前付きパラメータです。引数が2つ以上あるような場合は、名前付きパラメータを使うとコードが読みやすくなります。また、名前付きパラメータでしか指定できないパラメータもあるので、極力使うようにした方が良いでしょう。

 CGIモジュールは第一引数が「-」で始まる場合は名前付きパラメータであると自動で判断してくれます。名前付きパラメータは大文字、小文字を区別しません。例えば「-Type=>」でも「-TYPE=>」でも同じ意味になります。

 また、例えば「-values=>」などの特定のパラメータは、組み込み関数のvalues関数と名前が衝突するのでワーニングが出ることがあります。これを回避したい場合は「-Values=>」などの大文字表記にするのが一つの方法です。

 これで予備知識は十分なので、次はコードの解説をしていきます。まずは、HTTPヘッダの出力についてです。HTTPヘッダの出力はCGI::headerメソッドを使います。CGIではHTTPコンテンツの前にHTTPヘッダを自分で出力する必要があります。典型的なものは、

print "Content-type:text/html\n\n"

というものですね。HTTPヘッダの終わりは空行で判断されるので、最後に改行を2つ入れる必要があります。これをheaderメソッドを使って書くと、

print header();

となります。たいていの場合はこれで十分ですが、MIMEタイプなどを変える場合や付加的な情報を付ける場合はパラメータで指定します。では、headerメソッドの詳細な使い方です。

CGI::header
HTTPヘッダを生成する
書式
header
header type
header type, status
header -type=>type, -nph=>nph, -status=>status, -expires=>expires, -cookie=>cookie, -charset=>charset, -attachment=>attachment, -Cost=>cost
引数
type:
MIMEタイプ(デフォルト:text/html)
status:
ステータスコードとメッセージ(例:200 OK)
nph:
1を指定した場合は、NPH(no-parse-header)として動作する。
expires:
ブラウザやプロキシがCGIの出力をキャッシュする期間を設定する。(後述)
cookie:
ブラウザに対しクッキーの読み込み要求をするためのヘッダを生成する。
charset:
文字コードを指定する。(デフォルト:ISO-8859-1)
attachment:
ブラウザに対し、ファイルの保存ページもしくはプロンプトを出すように要求するヘッダを生成する。パラメータの値は、保存時のファイル名を指定する。この機能を正しく動作させるには、typeに"application/octet-stream"を指定する必要がある。(後述)
戻り値
HTTPヘッダ

 次章のHTTPヘッダの生成ではHTTPヘッダについてもう少し詳しく解説します。