$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