I downvoted this post because it's wrong. Please test your advice if you're not sure:
#!/usr/bin/perl -w
use strict;
sub foo { print "foo\n" }
my $f = 'foo';
&$f;
I generally prefer a dispatch table:
my %ops = (
one => \&one,
two => \&two,
);
my $op = $q->param( 'op' );
die "Invalid operation '$op'\n" unless exists $ops{ $op };
$subs{ $op }->();
You can also mess with can, though it's less secure -- with the ops hash you can control exactly which subs can ever be called.
my $op = $q->param( 'op' );
my $sub = __PACKAGE__->can( $op );
die "Invalid op '$op'\n" unless $sub;
$sub->();