in reply to "" in hash as a default?

This is perfectly valid. You can even do some tricks with it, like:
my %way_of = ( the_sword => sub{do('sword',@_)}, the_gun => sub{do('gun',@_)}, "" => sub{do('default',@_)}, ); my $what = $something; my $stuff = $something_else; &{$way_of{$what} || $way_of{""}}($stuff);
Great for building switch-type handlers with a default case.

In fact, Benchmark seems to indicate that this type of handler is faster than a series of equivalent if statements, such as:
if ($what eq 'the_sword') { do('sword', $stuff); } elsif ($what eq 'the_gun') { do('gun', $stuff); } else { do('default', $stuff); }
A hash lookup is very fast compared to evaluating a long if structure, especially as the number of elements increases.

However, note that this speed improvement is only possible if you only declare your hash table once. If it is declared inside a subroutine, it will be re-created every time that routine is call, slowing down processing substantially.