$ cat test.pl use 5.18.0; use warnings; use Benchmark qw( cmpthese ); my $x = join " " => "", ("abc") x 5, ""; sub splt { split " ", reverse ((split " ", (reverse $x), 1)[0]), 1; } sub rgx { $x =~ s/^\s+//r =~ s/\s+$//r; } sub trx { my $y = $x =~ y/ /x/cr; substr ($x, index ($y, "x"), rindex ($y, "x") - length ($x) + 1); } say "sourc: |$x|"; say "split: |", splt (), "|"; say "regex: |", rgx (), "|"; say "tr/x/: |", trx (), "|"; cmpthese (-2, { splt => \&splt, rgx => \&rgx, trx => \&trx }); #### $ perl test.pl sourc: | abc abc abc abc abc | split: |abc abc abc abc abc| regex: |abc abc abc abc abc| tr/x/: |abc abc abc abc abc| Rate rgx trx splt rgx 1047602/s -- -59% -65% trx 2553722/s 144% -- -14% splt 2958598/s 182% 16% -- #### $ cat test.pl use 5.18.0; use warnings; use Benchmark qw( cmpthese ); my $x = join " " => "", ("abc") x 5, ""; sub splt { join " " => split " " => $x; } sub rgx { $x =~ tr/ / /sr =~ s/^ //r =~ s/ $//r; } sub trx { my $y = $x =~ tr/ /x/cr; substr ($x, index ($y, "x"), rindex ($y, "x") - length ($x) + 1) =~ tr/ / /sr; } say "sourc: |$x|"; say "split: |", splt (), "|"; say "regex: |", rgx (), "|"; say "tr/x/: |", trx (), "|"; cmpthese (-2, { splt => \&splt, rgx => \&rgx, trx => \&trx }); #### $ perl test.pl sourc: | abc abc abc abc abc | split: |abc abc abc abc abc| regex: |abc abc abc abc abc| tr/x/: |abc abc abc abc abc| Rate rgx splt trx rgx 1012851/s -- -42% -52% splt 1739341/s 72% -- -17% trx 2105282/s 108% 21% --