URI::QueryParamで特定のキーだけ取って来る

長いパラメーターのついたURLをキレイにしたい。が、そのためだけにCGIモジュールを入れるのもアレだし、自前で実装するのもスマートではないし・・・と思って調べてみると、URI::QueryParam というモジュールがあるみたい。

URI::QueryParam - Additional query methods for URIs - metacpan.org

use strict;
use warnings;
use URI;
use URI::QueryParam;

my $longurl      = "http://www.google.co.jp/search?q=%E6%A1%9C%E6%B2%A2%E3%81%BF%E3%81%BF%E3%81%AA&lr=lang_ja&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ja:official&client=firefox-a";
my @request_keys = qw(q lr);

my $u = URI->new($longurl);
$u->query_form_hash({map {($_, $u->query_param($_))} @request_keys});
print $u;

実行結果。

$ perl qp.pl
http://www.google.co.jp/search?q=%E6%A1%9C%E6%B2%A2%E3%81%BF%E3%81%BF%E3%81%AA&lr=lang_ja

やったね!

追記

パラメーターの順番は保証されないみたい。実害はないが・・・。それを言ったら上の処理自体が実害ないって話で、見た目にこだわりたいから使ってるわけだしなあ。そこまで凝りたきゃquery_paramをひとつずつ使えってことか。