On Sun, Jan 30, 2011 at 11:46 AM, Joel Roth <joelz@pobox.com> wrote:
Hi all,
Hey Joel,
get '/media/*' => sub { my $path = splat; ... }
This matches '/media/foo' but I was expecting it to match '/media/foo/bar'.
You're right, it doesn't match /media/foo/bar. The reason is simple: the syntax for routes, as defined by Sinatra, is not pure regex, and avoids matching a slash on purpose.[1] The idea is that you could declare a variable being there, without providing a name, and then splat() returns it.
'/media/([\w/]+)' doesn't seem to work, either.
Since the route syntax doesn't cover regexp.
I'd welcome suggestions for either problem:
1. matching paths with several levels of hierarchy
If you know the level, and you want to be explicit, you can try the default route syntax: '/media/*/*'. However, you will most likely prefer a regular expression (which you tried earlier), and Dancer allows that very easily since Perl considers regexes as first class: get qr/.../ => sub { ... }; We prefer to wrap qr() with something other than slashes, so we don't get into a backslash fight: get qr{ / media / (.*) }x => sub { ... }; Enjoy! [1] As they say in Microsoft: "it's a feature, not a bug!"