Perl CGI でクエリ文字列を取得する
Perl CGI でクエリ文字列を取得する方法。GET リクエストの場合は URL のクエリパラメータ (?hoge=fuga&foo=bar
みたいなヤツ)、POST リクエストの場合はリクエストボディからデータを取得し、整形する。
# 最終的にリクエスト情報をまとめる連想配列
my %formData;
# QueryString を格納する
my $queryString;
# GET か POST かを判別し、取得方法を切り替える
if($ENV{'REQUEST_METHOD'} eq "POST") {
# POST の場合
read(STDIN, $queryString, $ENV{'CONTENT_LENGTH'});
}
else {
# GET の場合
$queryString = $ENV{'QUERY_STRING'};
}
# 'name=value' の配列に直す
my @queryPairs = split('&', $queryString);
foreach my $queryPair (@queryPairs) {
my ($name, $value) = split('=', $queryPair);
# パーセントエンコーディング文字列を戻す
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$formData{$name} = $value;
}
# パラメータがあれば出力する
if(%formData) {
while(my ($key, $value) = each(%formData)) {
print $key . " : " . $value;
}
}
$ENV{'REQUEST_METHOD'}
で判定した部分は、$ENV{'QUERY_STRING'} eq ""
と判定しても大きな差はないが、パラメータなしの GET の時も if
ブロックに入ってしまうので、少々違和感があった。
関数 (サブルーチン) としてまとめるなら %formData
を return
すれば良い。
- 参考 : CGI Perlでの作り方(Query String) -Bash Homepage-
- 参考 : 入力フォーム編(GETとPOSTデータを受け取るには) - futomi's CGI Cafe
- 参考 : 正規表現 - SMART 開発者のためのウェブマガジン
- パターンマッチ演算子
- 参考 : ハッシュが空かどうかを調べたい - 燈明日記
- ハッシュが空かどうか調べるには
if(%hash) { NotEmpty }
・if(!%hash) { Empty }
で分かる
- ハッシュが空かどうか調べるには