... use CGI qw/:standard/; my $q = CGI->new(); my $level = $q->param('level'); my %run_level = ('foo' => \&foo, 'bar' => \&bar, 'default' => \&default ); if (exists $run_level{$level}) { &{ $run_level{$level} }; } else { default(); } sub foo { return "Sub foo called"; } sub bar { return "Sub bar called"; } sub default { return "Sub default called"; } #### default() unless exists $run_level{$level}; exit unless exists $run_level{$level}; # or add exit into default() &{ $run_level{$level} };