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 ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access