use 5.18.0; use warnings; my $string = "AAATTTAGTTCTTAAGGCTGACATCGGTTTACGTCAGCGTTACCCCCCAAGTTATTGGGGACTTT"; my %subs; $subs{$_}++ for grep { length >= 2 } split m/,/ => ($string =~ s/([ACGT])\K(?!\1)/,/gr); printf "%5d %3d %s\n", $subs{$_->[1]}, @$_ for sort { $b->[0] <=> $a->[0] || $a->[1] cmp $b->[1] } map {[ length, $_ ]} keys %subs; #### 1 6 CCCCCC 1 4 GGGG 1 3 AAA 3 3 TTT 2 2 AA 2 2 GG 5 2 TT