in reply to Re: Subroutines in Dispatch Tables
in thread Subroutines in Dispatch Tables

In your approach, all dispatches have to be integer based (array) where as with a hash, you have the luxury of using any scalar value.

The last bit should be "any string", not "any scalar value".

And in his approach, all dispatches have to be regex-based, and that's rather more luxurious than any constant string.

The cost is in speed. His dispatch takes O(N) to find the correct dispatch, not O(1).

my $action; for my $dispatch (@$dispatch_tables) { my $regex = $dispatch->{regex}; if ($input =~ $regex) { $action = $dispatch->{action}; last; } } die("No match\n") if !$action; $action->($input);

Replies are listed 'Best First'.
Re^3: Subroutines in Dispatch Tables
by Limbic~Region (Chancellor) on Sep 23, 2009 at 00:16 UTC
    ikegami,
    Good catch on s/scalar/string/. I meant to add a line indicating that you could actually use just about anything you wanted as a hash key but that it would end up being stringified and unlikely do what you wanted.

    Regarding the luxury of using regexes - if your problem space fits a very specific model, you can still avoid the O(N) by using the technique outlined at Re: Massive regexp search and replace. With this particular implementation, I originally assumed that the idea was to loop over the regexes as you indicate with O(N) but then the usage in the example implied they index would be known. I probably read too much into it. Update: I should have said - either you are limited to integer dispatch values for O(1) or you will have to loop over the entire list O(N).

    Cheers - L~R