use strict; use warnings; use Test::More qw{ no_plan }; use Benchmark qw{ cmpthese }; my @animals = qw{ tlephane lamec hellyfisj sctopuo nuffip slbatrosa yonkem sippopotamuh kardvara phees }; my $expected = join q{:}, qw{ elephant camel jellyfish octopus puffin albatross monkey hippopotamus aardvark sheep }; my %methods = ( bitStr => sub { my @words = @_; substr( $_, 0, 1) ^= substr( $_, -1 ) ^= substr( $_, 0, 1 ) ^= substr( $_, -1 ) for @words; return join q{:}, @words; }, reRev => sub { my @words = @_; $_ = join q{}, reverse m{(.)(.*)(.)} for @words; return join q{:}, @words; }, reSub => sub { my @words = @_; s{(.)(.*)(.)}{$3$2$1} for @words; return join q{:}, @words; }, slice => sub { my @words = @_; $_ = join q{}, ( split m{} )[ -1, 1 .. length() - 2, 0 ] for @words; return join q{:}, @words; }, ssBy2s => sub { my @words = @_; ( substr( $_, 0, 1 ), substr $_, -1 ) = ( substr( $_, -1 ), substr $_, 0, 1 ) for @words; return join q{:}, @words; }, ssNeg => sub { my @words = @_; substr( $_, 0, 1 ) = substr $_, -1, 1, substr $_, 0, 1 for @words; return join q{:}, @words; }, ); foreach my $method ( sort keys %methods ) { my $result = $methods{ $method }->( @animals ); ok( $result eq $expected, $method ); } cmpthese( -3, { map { my $codeStr = q[sub { my $ref = $methods{ ] . $_ . q[ }->( @animals ); }]; $_ => eval $codeStr; } keys %methods } ); foreach my $method ( sort keys %methods ) { my $result = $methods{ $method }->( @animals ); ok( $result eq $expected, $method ); }