CGIモジュールの基礎1
■この章で解説するモジュール
CGI
■この章でできること
・CGIモジュールを使う
・メソッドグループを使う

 ここではCGIモジュールを使ったCGIの作成方法を解説します。CGIモジュールは多機能なので、何回かに分けて少しずつ解説していきたいと思います。順に読んでいくとCGIモジュールの全てが分かるような構成にしたいと思います。

 まず、PerlでCGIを作成する場合、必ずしもCGIモジュールを使う必要はありません。フォームからのデータ取得やHTMLの出力などを全て自分でコーディングすれば、CGIモジュールを使わなくてもCGIを作成することはできます。CGIモジュールに頼らないで、よりきめ細かい処理をしたい場合は、自力で作成した方が良いこともあります。

 CGIモジュールを使うとできることは、おおむね次の通りです。

・フォームからの入力データの取得

・フォームの前回入力値などの状態の保存、フォームコードの出力

・定型的なHTMLコードの出力

・アップロード、クッキー、CSS、サーバープッシュ、フレームなどの付加機能

 それでは、最初にCGIモジュールを使わないごく簡単なCGIスクリプトのサンプルを見てみましょう。

#!/usr/bin/perl

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

print << "HTML";
Content-type:text/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>Hello</title>
  <meta http-equiv="Content-Type" content="text/html; charset=shift_jis" />
</head>
<body>
  <h1>Hello</h1>
</body>
</html>
HTML

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

 HTTPヘッダとHTMLドキュメントを出力する原始的なCGIスクリプトです。ちなみに出力部分はヒアドキュメントを使っています。一行ごとにprint文を記述するよりもずっとコードが見やすくなります。CGIスクリプトを記述するときには便利なので覚えておきましょう。

 では、CGIモジュールを使って同じことをしてみます。コードは次のようになります。

#!/usr/bin/perl

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

use CGI;

$query = new CGI;

print $query->header();
print $query->start_html('Hello');
print $query->h1('Hello');
print $query->end_html();

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

 CGIモジュールを使うために、use CGI;でモジュールをインポートします。次にコンストラクタ(new)でCGIオブジェクトを作成しています。ここでは、CGIモジュールに用意されている、定型的なHTMLコードを出力するメソッドを利用して、HTMLコードを生成しています。

 後ほど詳しく解説しますが、CGI::headerはHTTPヘッダを出力します。CGI::start_html、CGI::end_htmlはそれぞれHTMLのヘッダとフッタを出力します。CGI::h1は<h1>タグ(見出し)をつけてテキストを出力します。

 生のHTMLのコードを直接出力するよりも、ずいぶんスクリプトがすっきりするのが分かると思います。これがCGIモジュールを使う利点の一つです。

 次に、CGIモジュールを使用する際の、もう一つのプログラミングスタイルについて触れておきます。次のサンプルを見てください。

#!/usr/bin/perl

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

use CGI qw/:standard/;

print header();
print start_html('Hello');
print h1('Hello');
print end_html();

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

 このサンプルでは、CGIモジュールのオブジェクトを作成しないで、直接CGIモジュールのメソッドを使っています。この場合は自動的に唯一のCGIオブジェクトがモジュール内部で作成されます。こちらの方がより簡潔になりますが、事前にCGIモジュールのメソッドを現在の名前空間にインポートする必要があります。それを行っているのが一行目の、

use CGI qw/:standard/;

です。このサンプルプログラムでは、header、start_html、h1、end_htmlの4つのメソッドしか使っていないので、

use CGI header, start_html, h1, end_html;

と記述しても結果は同じです。「:standard」というのは、メソッドグループと呼ばれるものです。これは複数のメソッドをグループ化したもので、これをインポートしておけばグループ内のメソッドが全てインポートされます。CGIモジュールのメソッドグループには次のようなものがあります。

グループ
内容
:cgi
CGI処理関連のメソッド
:form
フォーム生成関連のメソッド
:html
HTML関連のメソッド
:html2
HTML2.0関連のメソッド
:html3
HTML3.0関連のメソッド
:html4
HTML4関連のメソッド
:netscape
Netscapeによる拡張タグを生成するのメソッド
:standard
:html2、:html3、:html4、:form、:cgiを合わせたもの
:all
利用可能な全てのメソッド

 最初に示したオブジェクト指向な記述方法を使った場合は、一度に複数のCGIオブジェクトを扱うことができますが、二番目に示した関数指向な記述方法ではできません。これを踏まえてどちらの記述方法が良いかを選びましょう。

 次章のCGIモジュールの基礎2ではメソッドへのパラメータの指定方法を解説します。