Perl While循环只检查文件的第一行

时间:2014-10-07 19:38:23

标签: perl

我使用一个文件的行(TARGET)来查看它们是否在另一个文件中(CHECK)。如果TARGET文件在第一行中匹配,则它可以工作,但如果它在其他任何地方都没有。看起来第一个while循环只检查TARGET的第一行,而不是所有的行。如何让它实际检查文件的所有行?

while (my $line = <TARGET>) {
    chomp($line);
    while (my $check = <CHECK>) {
        if ($check =~ $line) {
            print "Found a match: $check";
        }
    }
}

谢谢。

3 个答案:

答案 0 :(得分:3)

您扫描TARGET第一行的整个CHECK文件句柄,然后没有更多行。如果你想以这种方式接近任务,你需要为TARGET的每一行倒回或重新打开CHECK。

答案 1 :(得分:2)

您的代码存在一些问题。

  1. $check =~ $line正在使用$line作为正则表达式来比较这两者。您应该使用字符串comparison operators来比较它们:$check eq $line
  2. chomp($line)但从未chomp($check)。这意味着$check将始终拥有它的尾随换行符。
  3. 从文件中读取行会移动文件指针,这意味着在完成内部while循环后,CHECK将保留在文件结尾。为防止这种情况,请在循环之前将数据加载到数组中。
  4. 尝试以下操作,看看它是否有效:

    chomp( my @lines  = <TARGET> );
    chomp( my @checks = <CHECK> );
    
    for my $line (@lines) {
        for my $check (@checks) {
            if ( $line eq $check ) {
                print "Found match: $check" . $/;
            }
        }
    }
    

答案 2 :(得分:1)

你有两个问题:

  1. 您只能一次从CHECK文件中读取,然后它会卡在eof

  2. 您正在使用正则表达式比较=~而不是字符串比较eq

  3. 我建议您将CHECK文件加载到哈希中,然后迭代其他文件:

    my %check = map { $_ => 1 } <CHECK>;
    
    while (<TARGET>) {
        if ( $check{$_} ) {
            print "Found a match: $_";
        }
    }