フォームデータを取得する (module)CGI
back
CGI モジュールを使えば、メソッド(GET/POST)を意識することなくデータを取得できる。
また、マルチパートのフォームデータ(enctype="multipart/form-data")も関係なく
取得できる。
また、URI エスケープも勝手にされる。
(ただし、< → > > → < & → & などのエスケープはされない)
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";
}
----
モジュールを使わない場合は、慣用句的に次のコードが使われる
----
if ($ENV{'REQUEST_METHOD'} eq "POST") {
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
}
else {
$buffer = $ENV{'QUERY_STRING'};
}
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