Perl:while循环不会继续使用指定的变量

时间:2011-12-24 12:37:52

标签: perl

这是我的代码:

while (<LIST>) {
    if (m|^\w|) {
        chomp;
        print "$_\n";
    }
    if (m|^\t|) {
        chomp;
        $search = substr($_, 1);
        print "  $search\n";
        while (<BIBLE>) {
            while ($_ =~ /\b$search\b/ig) {
                $book = substr($_, 0, 2);
                $chap = substr($_, 3, 3);
                $verse = substr($_, 7, 3);
                print "      $book:$chap:$verse\n";
            }
        }
    }
}

所以,基本上,我有一个单词列表和一个语料库。我从仅以制表符开头并将这些单词作为搜索词的行开始。然后,我想要搜索BIBLE文件句柄以查找该搜索词的每次出现。它按预期工作在第二个主循环中。它正在进入循环以打印列表中的剩余单词,但不会重新分配$ search变量并在语料库中连续搜索每个单词。这是输出:

headword1
  abahandiiki
      41:001:022
      41:002:016
      41:003:022
      41:007:005
      41:008:031
      41:009:011
      41:009:014
      41:009:016
      41:010:033
      41:011:018
      41:011:027
      41:012:035
      41:012:038
      41:014:001
      41:014:043
      41:014:053
      41:015:001
      41:015:031
      43:008:003
  abahe
  abaheereza
headword2
  baheereza
  baheerezakazi
  bahiire
  bahikiirire
  bahingi
  bahungire
headword3
  okurikuhikiirizibwa
  okurikushushana
  okurikusiimwa
  okurikwera
  okurogota
  okuruga
  okurugirira
  okurungi
  okurwanisa
  okurya
  okushaagaana
  okushara

有关如何进行后续搜索的任何想法?代码有问题吗?

1 个答案:

答案 0 :(得分:2)

该程序正在尝试读取列表中每个单词的整个BIBLE文件。第一个单词正在使用该文件,然后在每个单词之后使用EOF。您需要关闭并重新打开每个单词的BIBLE文件。当然,这是一个非常糟糕的做法。在CPAN中查看Lingua::Condordance

或者如Mat所说,你可以做seek(BIBLE, 0, 0);