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.