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