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モジュールの基礎2ではメソッドへのパラメータの指定方法を解説します。