As with most things in Perl, there are many ways to accomplish this task (avoiding the "uninitialized" error). Personally, the solution I use is contextual.
When doing form data validation where there can be a lot of fields, and all the field names may not neccessarily be known by the programmer, I like to use the OP's method:
if ($form{$key} && $form{$key} =~ /\w+/) { # ...
However, when checking data passed to a method or subroutine, I prefer to use the ||= (aka "default") method:
my ($self,$asdf) = @_;
$asdf ||= '';
Finally, in general, I try to scope, declare, and initialize my variables at the start of the program whenever possible.