つまり以下のようにする。uriオブジェクトを作る際にnewではなくnew_absを使う。
my $base = 'http://exampe.com/hoge/fuga/'; my $href = '../rss' my $uri = URI->new_abs($href, $base); print $uri;
1行で確かめる。確かに絶対指定に換わっていることがわかる。
$ perl -MURI -le '$base="http://exampe.com/hoge/fuga/"; $href="../rss"; $uri=URI->new_abs($href,$base); print $uri;' http://exampe.com/hoge/rss
もっとややこしい例
$ perl -MURI -le '$base="http://exampe.com/hoge/./fuga/../"; $href="./a/n/../rss"; $uri=URI->new_abs($href,$base); print $uri;' http://exampe.com/hoge/a/rss
名前的にはそれらしいカノニカル(正規化)はこのためには使えない。引用すると、絶対指定には使えないということがわかる。
このメソッドはURIの正規化されたものを返します。正規化のルールはスキームによって違います。通常はスキームとインターネット・ホスト名要素の小文字化、デフォルト・ポートと同じになっている明確なポート指定の削除、すべてのエスケープ・シーケンスの大文字化、普通に表現することができるエスケープされていオクテットの通常化です。
効率の理由から、$uriがすでに正規化されている形式であれば、コピーの代わりにそれへのリファレンスが返されます。
$uri->canonical; print $uri;