QUERY_STRING でパラメータを受け取る

先ほどのエントリで %ENV を表示する CGI プログラムを作りましたが、この CGI プログラムの URL の末尾に「?abc」と付けて、開いてみてください。
http://palmo.is.land.to/cgi/v/envtable.cgi?abc
$ENV{'QUERY_STRING'} の値として「abc」が入っているのが確認できると思います。


この「URL の最後に ? を付けて文字列を渡す」というのは、CGI などのウェブアプリケーションに簡単なパラメータを渡す時に利用されます。
HTML で送信フォームを作る為には <form> 要素を利用しますが、この際 method という属性を指定する必要があります。method は、HTTP リクエストに用いるメソッドを指定する属性で "GET" か "POST" を指定するのですが、これに "GET" を指定すると、URL の最後に「?」を付けて、「名前=値」の形の各パラメータが「&」でつなげられて渡されます。
例えば、以下のように HTML でフォームを作ってみます。

<form action="query.cgi" method="GET">
  <input type="text" name="value" />
  <input type="submit" value="送信" />
</form>

この場合、以下のように表示されます。

入力欄に何か入力して送信ボタンを押すと、ウェブブラウザソフトは自動的に「query.cgi?value=入力した内容」という URL へと移動します。


つまり CGI プログラム側で $ENV{'QUERY_STRING'} を参照すれば、どのような値が入力されたのか取得できる、という事になります。QUERY_STRING には「abc=012&def=345&ghi=678」のような文字列が入るので、以下のようにすれば各パラメータの名前をキーにしたハッシュを生成する事ができるはずです。

my %param = map { /([^=]+)=(.+)/ } split /&/, $ENV{'QUERY_STRING'};

まず $ENV{'QUERY_STRING'} を & で split すると、「名前=値」のリストを得る事ができます。そのリストに対して名前と値をキャプチャする正規表現map すれば (名前, 値, 名前, 値, 名前, 値...) というリストが得られるので、それをそのままハッシュ変数へ代入しています。
これにより、$param{'value'} を見れば「value=ABC」の "ABC" の部分を得る事ができますね。(^_^)


確認の為に、こんな CGI を作ってみました。

#!/usr/local/bin/perl
use strict;

my %param = map { /([^=]+)=(.+)/ } split /&/, $ENV{'QUERY_STRING'};

my $value;
if (exists $param{'value'}) {
    $value = "あなたが入力したのは「$param{'value'}」です。";
} else {
    $value = "入力してください。";
}

print <<HTML;
Content-Type: text/html

<html>
<head><title>QUERY_STRING Test</title></head>
<body>
<h1>QUERY_STRING Test</h1>

<form action="$ENV{'SCRIPT_NAME'}" method="GET">
  <input type="text" name="value" />
  <input type="submit" value="送信" />
</form>
<p>$value</p>

</body>
</html>
HTML

__END__

さきほど例として書いたフォームを使って、自分自身($ENV{'SCRIPT_NAME'})へ入力した内容(value)を送信するようにしています。
パラメータとして value が渡されていれば、その値を表示します。
実行結果は、以下で見る事ができます。
query.cgi 実行結果
これで、利用者からの入力を受け取って処理した内容を表示するような、動的なページも作る事ができそうですね。できる事が拡がっていくのは、とても楽しいです。(^_^)