$data =~ s/^\s*//; $data =~ s/\s*$//; #### use Benchmark; sub dotstar { my $data = $testdata; $data =~ s/^\s*(.*?)\s*$/$1/; return $data; } sub first_n_last { my $data = $testdata; $data =~ s/^\s*//; $data =~ s/\s*$//; return $data; } sub first_n_last_must_match { my $data = $testdata; $data =~ s/^\s+//; $data =~ s/\s+$//; return $data; } $testdata = ' ' x 200 . "abcd" x 20 . " " x 200; timethese( 100000, { dotstar => '&dotstar', first_n_last_1 => '&first_n_last', first_n_last_2 => '&first_n_last_must_match' } ) #### Benchmark: timing 100000 iterations of dotstar, first_n_last_1, first_n_last_2... dotstar: 7 wallclock secs ( 6.91 usr + 0.02 sys = 6.93 CPU) @ 14430.01/s (n=100000) first_n_last_1: 4 wallclock secs ( 4.21 usr + 0.00 sys = 4.21 CPU) @ 23775.56/s (n=100000) first_n_last_2: 2 wallclock secs ( 1.30 usr + 0.00 sys = 1.30 CPU) @ 76804.92/s (n=100000)