use strict ; use warnings ; my $string = "BEHACJBDLCENADFEGOFHQAGIHJRBIKJLSCKMLNTDMOFNPOQTGPRIQSKRTMPS"; my @results = () ; collect('W1SDM', W1SDM($string)) ; collect('GrandFather', GrandFather($string)) ; collect('GMCH', GMCH($string)) ; printf("%12s %12s %12s\n", @$_) foreach @results ; use Benchmark qw(cmpthese) ; cmpthese(100, { W1SDM => sub { W1SDM($string) for (1..1000) }, GrandFather => sub { GrandFather($string) for (1..1000) }, GMCH => sub { GMCH($string) for (1..1000) }, } ) ; sub collect { my ($t, $r) = @_ ; push @{$results[0]}, $t ; push @{$results[$_]}, sprintf "%02d %02d %02d", @{$r->[$_]}[1..3] for (1..$#$r); } ; sub W1SDM { my ($string) = @_ ; my @array = split //, $string; my @result = () ; for my $i (1..20) { for my $j (1..3) { $result[$i][$j] = ord(shift(@array)) - 64; } } return \@result ; } ; sub GrandFather { my ($string) = @_ ; my @array = (undef); push @array, [0, map {ord ($_) - 64} split '', substr $string, 0, 3, '' ] while length $string; return \@array ; } ; sub GMCH { my ($string) = @_ ; my @array = (undef, map([undef, map($_-64, unpack('C3', $_))], unpack('(A3)*', $string))) ; return \@array ; } ;