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 tracked ...

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.