新人求教-输出时输出次数为何随词序递增

新人求教-输出时输出次数为何随词序递增

编写一个程序,最后一个输出的问题卡住了,特此求教:

要求: 任意一篇英语文章atext.txt, 找寻几个可能重复出现的特定词,将其输出,输出方式为: 特定词前十个词 [特定词] 特定词后十个词 (换行);不用考虑标点。

特定词为一个词时没有问题,如搜寻permet:

$w= "permet";

open(T, '<', 'atext.txt');
while ( $line = <T> )  {
    push(@words, split /\W+/, $line);
}

foreach $c (0..$#words) {
        if ($words[$c] eq $w) {
          print "@words[$c-10..$c-1] \[$w\] @words[$c+1..$c+10]\n";
    }
}

以上结果与要求相符

但如果特定词为表格中的几个词(三个词为例),输出时输出次数会随着词序递增(即第一个词的结果出现一遍,第二个的结果会多重复出现一遍,第三个词的结果出现三遍),程序如下:

@t2= ("permet","ans","permets");

foreach $w2 (@t2){

  open(T, '<', 'atext.txt');
    while ( $line = <T> )  {
      push(@words2, split /\W+/, $line);
    }

  foreach $c (0..$#words2) {
    if ($words2[$c] eq $w2) {
        print "@words[$c-10..$c-1] \[$w\] @words[$c+1..$c+10]\n";
    }
  }
}

如何解决,谢谢!
原程序重复读入,调一下就好了。

[Copy to clipboard] [ - ]
CODE:
@t2= ("permet","ans","permets");

open(T, '<', 'atext.txt');
while ( $line = <T> )  {
  push(@words2, split /\W+/, $line);
}

foreach $w2 (@t2){
  foreach $c (0..$#words2) {
    if ($words2[$c] eq $w2) {
        print "@words[$c-10..$c-1] \[$w\] @words[$c+1..$c+10]\n";
    }
  }
}

运行后正确,非常感谢!
想多问一句,为何按照原来的写法会出现随词序递增的情况,是哪一句话让电脑这样做的?
想知道错的原因


QUOTE:
open(T, '<', 'atext.txt');

这个写在循环里面当然挂了
还有写东西最好加上
use strict;
use warnings;