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 ブロックに入ってしまうので、少々違和感があった。

関数 (サブルーチン) としてまとめるなら %formDatareturn すれば良い。