use strict; use warnings; use Benchmark qw/cmpthese/; my @translation = qw / Zero One Two Three/; my %trans = (1 => "One", 2 => "Two", 3 => "Three"); my @dispatch = ( sub {return "Zero"}, sub {return "One"}, sub {return "Two"}, sub {return "Three"} ); sub test1 { my $var2 = shift; return ("One") if ($var2 =~ /^1/ ); return ("Two") if ($var2 =~ /^2/ ); return ("Three") if ($var2 =~ /^3/ ); return undef; } sub test2 { my $var2 = substr shift, 0, 1; return ("One") if ($var2 == 1 ); return ("Two") if ($var2 == 2 ); return ("Three") if ($var2 == 3 ); return undef; } sub test3 { return $translation[(substr shift, 0, 1)]; } sub test4 { my $var = shift; return $trans{$1} if $var =~ /^(\d)\./ ; } sub test5 { my $var = substr shift, 0, 1; eval { goto "_$var" } or return "Other"; _1: return "One" ; _2: return "Two" ; _3: return "Three"; } sub test6 { return $dispatch[(substr shift, 0, 1)]->(); } cmpthese( -1, { _linear_1 => q {test1("2.01.000")}, _linear_2 => q {test2("2.01.000")}, _array => q {test3("2.01.000")}, _hash_regex => q {test4("2.01.000")}, _goto => q {test5("2.01.000")}, _dispatch => q {test6("2.01.000")}, } )