$sequence =~ /(ATG.*?(?<=TAA|TAG|TGA))/g #### ATGGTTTCTCCCATCTCTCCATCGGCATAA ATGA #### my @from; my $pos = -1; push @from, $pos while -1 != ($pos = index $sequence, 'ATG', $pos + 1); my @to; for my $end (qw( TAA TAG TGA )) { $pos = -1; push @to, $pos + 3 while -1 != ($pos = index $sequence, $end, $pos + 1); } for my $f (@from) { for my $t (@to) { say substr $sequence, $f, $t - $f if $t > $f; } } __END__ Output: ATGGTTTCTCCCATCTCTCCATCGGCATAA ATGGTTTCTCCCATCTCTCCATCGGCATAAAAATACAGAATGATCTAA ATGGTTTCTCCCATCTCTCCATCGGCATAAAAATACAGAATGA ATGATCTAA ATGA