use strict; use warnings; use Benchmark qw(cmpthese); my $short = q( a b c ); my $long = join('x', map {' ' x (int(rand(20))+1)} 1 .. 100); my %func = ( triple_s => <<'EOFUNC', sub { my $str = $_; $str =~ s/^\s*//; $str =~ s/\s*$//; $str =~ s/\s+/ /g; $str; } EOFUNC triple_sp => <<'EOFUNC', sub { my $str = $_; $str =~ s/^\s+//; $str =~ s/\s+$//; $str =~ s/\s+/ /g; $str; } EOFUNC triple_sp_r => <<'EOFUNC', sub { my $str = $_; $str =~ s/\s+/ /g; $str =~ s/^\s+//; $str =~ s/\s+$//; $str; } EOFUNC double_s => <<'EOFUNC', sub { my $str = $_; $str =~ s/^\s*|\s*$//g; $str =~ s/\s+/ /g; $str; } EOFUNC double_sp => <<'EOFUNC', sub { my $str = $_; $str =~ s/^\s+|\s+$//g; $str =~ s/\s+/ /g; $str; } EOFUNC double_sp_r => <<'EOFUNC', sub { my $str = $_; $str =~ s/\s+/ /g; $str =~ s/^\s+|\s+$//g; $str; } EOFUNC join_split => <<'EOFUNC', sub { my $str = $_; join ' ', split ' ', $str; } EOFUNC ); sub make { my ($str, $f) = @_; ($f = $func{$f}) =~ s/_/$str/; eval $f; } print "\nShort string:\n"; cmpthese(-5, { '3-s' => make(qw(short triple_s)), '2-s' => make(qw(short double_s)), '3-sp' => make(qw(short triple_sp)), '2-sp' => make(qw(short double_sp)), '3-sp_r' => make(qw(short triple_sp_r)), '2-sp_r' => make(qw(short double_sp_r)), 'j-split' => make(qw(short join_split)), }); print "\nLong string:\n"; cmpthese(-5, { '3-s' => make(qw(long triple_s)), '2-s' => make(qw(long double_s)), '3-sp' => make(qw(long triple_sp)), '2-sp' => make(qw(long double_sp)), '3-sp_r' => make(qw(long triple_sp_r)), '2-sp_r' => make(qw(long double_sp_r)), 'j-split' => make(qw(long join_split)), });