use strict; use warnings; use Benchmark qw(:all); my $s = 'xx55111111116jkwhcxxxxx'; sub test1 { my $r; my $r0; my @R; for my $c (split '', $s) { unless (defined $r) { $r = $c; $r0 = $c; } elsif($c eq $r0) { $r .= $c; } else { push @R, $r; $r = $c; $r0 = $c; } } push @R, $r if length $r; @R; } sub test2 { keys %{{$s =~ /((.)\2*)/g}} } sub test3 { my @x = $s =~ m/((.)\2*)/g; map $x[2*$_], 0..@x/2-1; } cmpthese (-20, { for => \&test1, pKai => \&test2, murphy => \&test3, } );