さっきかいたの
PACKAGE->inflate_column( query => { inflate => sub { my $u = URI->new; $u->query(shift);
my $ret = {};
for my $k ( $u->query_param ) {
my @v = $u->query_param($k);
$ret->{$k} = @v > 1 ? [@v] : $v[0];
}
$ret;
},
deflate => sub {
my $utf8off = sub {
my $str = shift;
utf8::encode($str) if utf8::is_utf8($str);
};
my $hash = shift;
for ( keys %$hash ) {
if ( ref $hash->{$_} eq 'ARRAY' ) {
$utf8off->($_) for @{ $hash->{$_} };
}
else {
$utf8off->( $hash->{$_} );
}
}
my $u = URI->new;
$u->query_param(%$hash);
$u->query;
},
}
);
foo=bar&baz=blah
みたいなクエリを保存するカラムに、ハッシュで保存してハッシュで取り出すというやつ。
短くかけるかと思って書き始めたら、URIの query_form
や query_param
にutf8フラグったの渡すとこけたり、foo=bar&foo=baz
のように配列になるべきものがうまくハッシュにできなかったりとかしてこんなに長く。