Ваш сценарий ответа читается немного неловко и содержит несколько потенциальных ошибок. Я бы переписал основной логический цикл так:
foreach my $line (grep { /expend_VB/ } @sentences) {
my @nouns = grep { /_NN/ } split /\s+/, $line;
foreach my $word (@nouns) {
$word =~ s/_NN//;
print "$word\n";
}
print "$line\n" if scalar(@nouns);
}
Вам необходимо поместить объявление my в цикл - в противном случае оно будет сохраняться дольше, чем вы хотите, и, вероятно, может вызвать проблемы позже.
foreach - более распространенная идиома perl для перебора списка.