Hack #98. Improve Your Dispatch Tables

Run code based on regex matches.

A dispatch table, in the form of a hash, is a useful technique for associating code with keys:

my %dispatch =
(
    red   => sub { return qq{<font color="#ff0000">$_[0]</font>} },
    green => sub { return qq{<font color="#00ff00">$_[0]</font>} },
    blue  => sub { return qq{<font color="#0000ff">$_[0]</font>} },
    black => sub { return qq{<font color="#000000">$_[0]</font>} },
    white => sub { return qq{<font color="#ffffff">$_[0]</font>} },
);

This approach lets you print out pretty HTML:

print $dispatch{black}->('knight');

Of course, this only works as long as the keys you use are fixed strings, because the hash lookup relies on string equality.

A regular expression that contains meta-characters (such as \\d or [abc]) can match strings, but the string matched is not equal (in the sense of string equality) to the regular expression. In other words, this reasonable-looking code just does not work:

my %dispatch =
(
  # note that backslashes need to be "doubled up"
  '\\\\d'   => sub { return "saw a digit" },
  '[a-z]' => sub { return "saw a lowercase letter" },
);

Looking up $dispatch{5} won't find anything. Being able to make it work would be very useful; Regexp::Assemble will let you do just that.

The hack

The idea is to gather all the different keys of the dispatch table and assemble them into a single regular expression. Given such an expression, you can then apply it to a target string and see what matches.

Even better, specifying a ...

Get Perl Hacks now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.