You can, but you don't want that, because it makes it too easy to use other subroutines in your script. You want to use a table mapping the names to your subroutines like this ("dispatch table"):
sub report { print "Reporting"; };
sub add { print "Adding"; };
sub frobnicate { print "Frobnicating"; };
my %allowed_actions = (
report => \&report,
add => \&add,
frobnicate => \&frobnicate,
...
);
sub handle_form {
my $query = CGI->new();
my $default_action = 'report';
my $action = $query->param('action') || $default_action;
# Sanity check
if (not exists $allowed_actions{$action}) {
warn "Unknown action >>$action<< attempted. Forcing to '$defau
+lt_action' instead.";
$action = $default_action;
};
my $code = $allowed_actions{$action};
# Now, call the code
$code->($query);
};