Вы говорите, что хотите удалить все после первого стоп-кодона.Если это так, то все, что вам нужно, это
while (<FH>) {
s/(?<=TAA|TAG|TGA).*//;
print;
}
Но есть мистическое требование: «Я хочу перебрать строку из 3-х позиций (символов) за раз».Это не имеет никакого смысла.Возможно, вы хотите, чтобы матч происходил в позиции, которая делится на три?Если это так, вы бы использовали
s/^(?:.{3})*?(?:TAA|TAG|TGA)\K.*//; # Requires 5.10+
s/^((?:.{3})*?(?:TAA|TAG|TGA)).*/$1/; # Backwards compatible