Fair criticism, though I would point out the total lack of context on the question at large. How about a compromise, which still lets the user specify their subroutine with a string, as per spec:
#!/usr/bin/perl
use strict;
use warnings;
my $sub_name = 'do_this';
my %dispatch_table = (do_this => \&do_this,
do_that => \&do_that,
);
print $dispatch_table{$sub_name}("Fred");
sub do_this {
my $var = shift;
return "My name is $var";
}
sub do_that {
my $var = shift;
return "My name is not $var";
}
__END__
My name is Fred