CGI モジュール(1) パラメータを受け取る

CGI プログラムの基本的な作り方がわかってきたので、そろそろ CGI モジュールを勉強したいと思います。CGI モジュールは Perl5 標準の組み込みモジュールで、CGI プログラムを作るのに便利な機能が利用できるようになるモジュールです。(Japanized Perl Resources Project にて日本語に翻訳された POD も公開されています)
CGI モジュールの利用方法は、従来の「関数型」(関数をエクスポートして、モジュールの外部で関数を利用する)と、「オブジェクト型」(new クラスメソッドを呼び出して CGI パッケージのインスタンスを生成してメソッドを利用する)という2つの方法があります。前者の関数型は手軽に利用できますが、多くの関数がエクスポートされる事になりますので、識別子の衝突など名前空間の汚染が心配です。後者のオブジェクト型は多少手続きが必要ですが、名前空間の汚染はありません。
多くのモジュールは、このように「関数型」と「オブジェクト型」という2つのインターフェースを提供していますが、ぱるも日記では主にオブジェクト型を利用していきたいと思います。ただし、Perl によるオブジェクト指向プログラミングは「関数型に比べて遅い」という事を留意しておかなくてはいけませんね。(^_^)
CGI モジュールをオブジェクトとして利用するには、まず use してから、コンストラクタ new を呼び出します。慣例として CGI オブジェクトを入れる変数名には $q が使われるそうです。(query からきているのかな?)

use CGI;
my $q = CGI->new();


では、CGI モジュールの機能の一部を利用してみたいと思います。
「パラメータの受け取り」は、環境変数 QUERY_STRING を介する方法と、標準入力を介する方法という2通りの方法を勉強しました。

CGI モジュールを利用すると、このパラメータの受け取りをとても簡単に行なう事ができます。こうなると、上のエントリで勉強した方法は「車輪の再発明」と呼ばれてしまいそうですが、CGI の仕組みを理解する為でしたのでお許しください。(^_^;)
与えられたパラメータの値を取得するには、param メソッドを利用します。このメソッドは "GET" の QUERY_STRING 形式にも "POST" の標準入力形式にも対応しているので、これらのリクエストメソッドの違いを意識する事なく利用できます。
例えば、以下のような URL で GET リクエストされたとします。

/action.cgi?apple=red&banana=yellow&peach=pink

「名前=値」のリストが「&」で区切られてるのでしたね。(^_^)
この action.cgi の中で param メソッドを使えば、以下のように名前に対応する値を取得できます。

print $q->param('apple'), "\n";   # red
print $q->param('banana'), "\n";  # yellow
print $q->param('peach'), "\n";   # pink

また、引数を渡さずに param メソッドを呼び出すと、パラメータとして渡された名前のリストを取得できます。下のコードでは全てのパラメータを列挙しています。

for my $name ($q->param) {
  print "$name is ", $q->param($name), ",\n";
}

上のコードでは、全てのパラメータを列挙します。簡単ですね。(^_^)


POST でパラメータを受け取る」で作った echo.cgi を、CGI モジュールを使って作り変えると、以下のようになりました。テンプレートは流用しています。
echo2.cgi 実行結果 (ソースコードテンプレート
自前でパラメータ解析を実装していた echo.cgi と比べると、大分コードが短くなっています。
また、もう一つのメリットとして、param メソッドを通じて取得した値は自動的にアンエスケープされるので、日本語や改行を入力しても、ちゃんと表示されます。便利ですね。(^_^)