Hashes of Functions

When writing a complex application or network service in Perl, you might want to make a large number of commands available to your users. Such a program might have code like this to examine the user's selection and take appropriate action:

if ($cmd =~ /^exit$/i) {
 exit
}
elsif ($cmd =~ /^help$/i) {
 show_help()
}
elsif ($cmd =~ /^watch$/i) {
 $watch = 1
}
elsif ($cmd =~ /^mail$/i) {
 mail_msg($msg)
}
elsif ($cmd =~ /^edit$/i) {
 $edited++; editmsg($msg);
}
elsif ($cmd =~ /^delete$/i) {
 confirm_kill()
}
else {
 warn "Unknown command: `$cmd'; Try `help' next time\n";
}


You can also store references to functions in your data structures, just as you can store references to arrays or hashes:

%HoF = ( # Compose a hash of functions exit => sub {
 exit }, help => \&show_help, watch => sub {
 $watch = 1 }, mail => sub {
 mail_msg($msg) }, edit => sub {
 $edited++; editmsg($msg);
}
, delete => \&confirm_kill, ); if ($HoF{lc $cmd}) {
 $HoF{lc $cmd}->()
}
# Call function else {
 warn "Unknown command: `$cmd'; Try `help' next time\n" }


In the second to last line, we check whether the specified command name (in lowercase) exists in our "dispatch table", %HoF. If so, we invoke the appropriate command by dereferencing the hash value as a function and pass that function an empty argument list. We could also have dereferenced it as &{ $HoF{lc $cmd} }(), or, as of the 5.6 release of Perl, simply $HoF{lc $cmd}().