I see your point (and obviously misunderstood what you were questioning when I posted my earlier reply), but I'm not convinced that the equivalent
my %dispatch = (
first => \&_create_first,
last => \&_create_last,
user => \&_create_user,
id => \&_create_id,
email => \&_create_email,
create_password => \&_create_create_password,
);
is any more virtuous than the
map in the OP. Both have the same potential for run-time errors if one or more of the referenced subs doesn't actually exist - simply naming them explicitly does not turn it into a compile-time error:
$ perl -E 'use strict; use warnings; my %d = ( foo => \&foo ); say "OK
+"'
OK
Retyping
_create_ every time doesn't actually buy you anything aside from maybe an eyeball error check. (
_create_create_password does look a little suspicious to me, but it might still be correct in the OP's code.)