我使用一个文件的行(TARGET)来查看它们是否在另一个文件中(CHECK)。如果TARGET文件在第一行中匹配,则它可以工作,但如果它在其他任何地方都没有。看起来第一个while循环只检查TARGET的第一行,而不是所有的行。如何让它实际检查文件的所有行?
while (my $line = <TARGET>) {
chomp($line);
while (my $check = <CHECK>) {
if ($check =~ $line) {
print "Found a match: $check";
}
}
}
谢谢。
答案 0 :(得分:3)
您扫描TARGET第一行的整个CHECK文件句柄,然后没有更多行。如果你想以这种方式接近任务,你需要为TARGET的每一行倒回或重新打开CHECK。
答案 1 :(得分:2)
您的代码存在一些问题。
$check =~ $line
正在使用$line
作为正则表达式来比较这两者。您应该使用字符串comparison operators来比较它们:$check eq $line
。chomp($line)
但从未chomp($check)
。这意味着$check
将始终拥有它的尾随换行符。while
循环后,CHECK
将保留在文件结尾。为防止这种情况,请在循环之前将数据加载到数组中。尝试以下操作,看看它是否有效:
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)
你有两个问题:
您只能一次从CHECK文件中读取,然后它会卡在eof
。
您正在使用正则表达式比较=~
而不是字符串比较eq
我建议您将CHECK文件加载到哈希中,然后迭代其他文件:
my %check = map { $_ => 1 } <CHECK>;
while (<TARGET>) {
if ( $check{$_} ) {
print "Found a match: $_";
}
}