Plack-0.99_01からHash::MultiValueでRequestが実装されて

取得できる型が自分でコントロールできるので、

ハッシュでの、不思議バグ解決

が起こりにくくなるのでようやく安心できる日々が来るんじゃないかと思いました。(追記:param()からだと挙動は同じなので、hashで取得した際でした。) perlで作られているシステムの開発/保守とかをしてた時期に、結構な割合でsecurityホールになっていて、とてもうざかったのを覚えています。Data::FormValidatorとかもこの辺スルーしてしまうし。

ちなみに、FormValidator::LazyWayではその辺吸収してたりします。

例 : 以下の用に、取得したい型(scalar,array)を自身でコントロールすることができます。

use Data::Dumper;
use Hash::MultiValue;

my $hash = Hash::MultiValue->new(
    x =>  23,
    x =>  4,
    y => 'g'
);  

# 必ず1つの値
my $x = {
  x => $hash->{x},
  y => $hash->{y},
};

warn Dumper $x;

#$xと同じ結果
my $y = {
  x => $hash->get('x'),
  y => $hash->get('y'),
};

warn Dumper $y;

# 複数取りたい時
my $z = {
    x => [$hash->get_all('x')],
    y => [$hash->get_all('y')],
};  

warn Dumper $z;

# だめなやつ。param()を利用したらおこっていた現象
my $xxx = {
    x => $hash->get_all('x'),
    y => $hash->{y},
};


warn Dumper $xxx;

結果

$x = {
          'y' => 'g',
          'x' => 4
        };
$y = {
          'y' => 'g',
          'x' => 4
        };
$z = {
          'y' => [
                   'g'
                 ],
          'x' => [
                   23,
                   4
                 ]
        };
$xxx = {
          '4' => 'y',
          'g' => undef,
          'x' => 23
        };