2011年 06月 15日

クエリ文字列をなんかいい感じに正規化っぽいことしたい

key 順でソートしたいけど、同じ key の value の順番は変えたくないみたいな。

最初もっとダサかったけど motemen さんに query_form_hash とか教えてもらった。canonical とインターフェイスを似せた query_form_canonical を定義してみる。なんか、そもそも論とかありそう。

use URI;
use URI::QueryParam;

sub URI::query_form_canonical {
	my $self = shift;
	my $other = $self->clone;

	my $hash = $self->query_form_hash;

	$other->query_form(map { $_ => $hash->{$_} } sort keys %$hash);
	$other;
}

sub nearly_equal ($$) {
	my ($a, $b) = @_;
	$a = URI->new($a);
	$b = URI->new($b);

	$a->query_form_canonical->eq($b->query_form_canonical);
}

use Test::More;

ok nearly_equal('/foo/bar?b=b&a=a&b=c', '/foo/bar?a=a&b=b&b=c');
ok !nearly_equal('/foo/bar?a=a&b=b&b=c', '/foo/bar?a=a&b=c&b=b');
ok nearly_equal('/foo/bar', '/foo/bar');

done_testing;

一部間違っていたので修正した

http://twitter.com/#!/nanto_vi/status/83883488855592961:twitter:detail