#!/usr/bin/perl use strict; use warnings; use Data::Dumper; use constant MIN => 2; my $str='aabcdabcabcecdecd'; sub count { local $_=shift; my $l=length; my %count; for my $off (0..$l-1) { for my $len (MIN .. $l-$off) { my $s=substr $_, $off, $len; $count{ $s } ||= ()= /$s/g; } $count{$_} == 1 and delete $count{$_} for keys %count; } \%count; } print Dumper count $str; __END__