in reply to Mapping URLs to code - in search of perlish dispatch schemes

A straight regex like that is dangerous because the order of the keys could change. To me it looks like you are trying to map different parameter combinations/values to subs. So how about something like:

map_query($cgi, { _page => 'edit', node => /(\w+)/, code => sub { print "You're trying to edit '$node'" }; },{ _page => 'create' name => /(\w+)/, _code => sub { print "You're trying to create '$name' but gave no + code to fill it"; } },{ _page => 'create', name => /(\w+)/, code => /(.*)/, _code => sub { print "Created as sub $name { $code }"; }; },{ _page => /.*/, _code => sub { print "Don't know how to handle " . $q->query_path +; } } );

It is just a rough first attack and i think there is another level of abstraction in there, but you get the idea. It would also be friendly to both post/get requests


___________
Eric Hodges

Replies are listed 'Best First'.
Re^2: Mapping URLs to code - in search of perlish dispatch schemes
by Corion (Patriarch) on Jul 21, 2006 at 06:29 UTC

    That's too wordy for me. I want to write it like a regex, but expect it to match like smarter Perl code - so my "regex"-like syntax would then be translated into your syntax or diotalevi's elegant Prolog example, nothingmuch's Monju model or maybe even an XML document against which XPath queries are run to determine the matching nodes.

      I like both - thought I think the structured args approach will be mucho clearer for perl newbies and casuals.

      I am worried about the efficiency of matching an actual URL against the parsed definitions. Do you have thoughts on how you are going to make this efficient? Efficiency being memory based for some, and speed based for others?

        I haven't thought about the speed at all yet, but seeing that the same decision tree is executed in traditional code as well, I don't think this will be much of a problem. Maybe the Prolog approach will be a performance problem, but first I want to get the syntax convenient before I worry about the implementation too much.