use strict; use Data::Dumper; use List::MapMulti 'iterator_multi'; my @userDefined = qw(AAA AAC ACA CAA); my $string = 'AAAAA AAACACA CAACAAA'; my %results = map { $_ => 0; } @userDefined; my $iter = iterator_multi [0..length($string)-1], [1..length($string)]; while (my ($start, $end) = $iter->()) { next unless $end > $start; my $substr = substr $string, $start, ($end - $start); $results{$substr}++ if exists $results{$substr}; } print Dumper \%results;