URLの中でコロン(:)などの予約語を使う / Mojoliciousリファレンス
Mojoliciousのルーターは、細かい設定などができて、とても便利です。けれども、使ってみると:と#と*と.が予約語になっているということに気づくと思います。
これらの記号をURLの中で利用したい場合はあきらめるしかないのでしょうか(#はURLの中でフラグメントとしての意味を持つので除く)。以下のような指定では正しくパラメーターを取得することができません。
# 間違い (/20101114:mainでパラメータを正しく取得できない)
get '/(:date):(:id)' => sub {
my $self = shift;
my $date = $self->param('date');
my $id = $self->param('id');
$self->render(text => "$date $id");
};
コロンは予約語なので、このようなルートの指定はうまくいきません。
解決策として、正規表現による制約を利用する
けれども、Mojoliciousのルーターはきわめて柔軟なので、通常のルータと正規表現を組み合わせることができます。
つまり、予約語を含むような部分は正規表現で記述すれば、すっきりとはいきませんが、解決できます。
# 正しい (/20101114:mainでパラメータを正しく取得できる)
get '/:date_id' => [date_id => qr/[^:]+?:[^:]+/] => sub {
my $self = shift;
my $date_id = $self->param('date_id');
my ($date, $id) = $date_id =~ /([^:]+?):([^:]+)/;
$self->render(text => "$date $id");
};
プレースホルダーを$data_idという名前にして、これに対して正規表現を使って制約を記述しています。/20101114:mainにマッチするルートを記述できています。
後は、同じ正規表現を使って、分割するだけです。
Perlゼミ

