フォームデータを取得する (module)CGI

back
CGI モジュールを使えば、メソッド(GET/POST)を意識することなくデータを取得できる。
また、マルチパートのフォームデータ(enctype="multipart/form-data")も関係なく
取得できる。
また、URI エスケープも勝手にされる。
(ただし、< → &gt; > → &lt; & → &amp; などのエスケープはされない)

use CGI;
my $query = new CGI;


ある一つの key=value を $key で取得する
----
my $key = $query->param('key');
----

同一のキーで複数の値を持つ key=value1&key=value2&key=value3 を @key で取得する
----
my @key = $query->param('key');
----

全てのキー・値をまとめて一つのハッシュ %param で取得する
(古いバージョンは Vars メソッドはない)
----
my %params = $query->Vars;

foreach (keys %params) {
  print "$_: ";
  print join(",", split(/\0/, $params{$_})), "\n";
}
----
※ 一つのキーが複数の値を持っているパラメタは、\0 で区切られて格納される

上記は、リストコンテキストで呼ばれるとハッシュになるが、スカラーコンテキストで
呼ばれると、リファレンスになる。
----
my $params = $query->Vars;

foreach (keys %$params) {
  print "$_: ";
  print join(",", split(/\0/, $params->{$_})), "\n";
}
----



モジュールを使わない場合は、慣用句的に次のコードが使われる

----
# query の取得
if ($ENV{'REQUEST_METHOD'} eq "POST") {
  read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
}
else {
  $buffer = $ENV{'QUERY_STRING'};
}

# query の分解
foreach my $pair (split(/&/,$buffer)) {

  ($name, $value) = split(/=/, $pair);
  $value =~ tr/+/ /;
  $value =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('H2', $1)/eg;
  # 必要があればこのへんに値のサニタイジングや文字コード変換
  $params{$name} = $value;
}
----

back