我是编程的新手,我希望有人可以向我解释一下:
所以我有两个文本文件,即Scan1.txt和Scan2.txt,它们存储在我的电脑中。 Scan1.txt包含:
Tom
white
black
mark
john
ben
Scan2.txt包含:
bob
ben
white
gary
tom
black
patrick
我必须提取这两个文件的匹配值和不匹配的值,然后单独打印它们。我以某种方式找到了解决方案,这很好。但有人可以解释这场比赛究竟是如何发生的。看起来只是这一行:
代码中的$hash{$matchline}++
执行匹配,并在找到匹配时递增哈希值。我理解逻辑,但我不明白这种匹配是如何实际发生的。有人能帮助我理解这个吗?
提前谢谢!
以下是代码:
open (F1, "Scan1.txt");
open (F2, "Scan2.txt");
%hash=();
while ($matchline= <F1> ){
$hash{$matchline}=1;
}
close F1;
while( $matchline= <F2> ){
$hash{$matchline}++;
}
close F2;
foreach $matchline (keys %hash){
if ($hash{$matchline} == 1){
chomp($matchline);
push(@unmatched, $matchline);
}
else{
chomp($matchline);
push (@matched, $matchline);
}
}
print "Matched Entries are >>\n";
print "```````````````````````\n";
print join ("\n", @matched) . "\n";
print "```````````````````````\n";
print "Unmatched Entries are >>\n";
print "```````````````````````\n";
print join ("\n", @unmatched) . "\n";
print "```````````````````````\n";
答案 0 :(得分:0)
如果给定的单词在第二个文件中存在多次而在第一个文件中不存在,则上面提到的代码会给出错误的结果。
这一行: $哈希{$匹配线} ++ 为每个不同的单词递增一个不同的计数器。
在第一个循环中,它为第一个文件中的单词设置为1。
因此,如果每个文件中都有一个单词,则计数器至少为2。
$ hash本身就是一组计数器。
答案 1 :(得分:0)
您的问题的更通用版本是计算两个集合之间的集合或交集。这个问题link可以很好地解决这个问题。
在您的情况下,该集合只是每个文件的值列表。逻辑是,如果两个文件中都存在某个值,那么$ hash {matchline} == 2,因为该值将在两个while循环中递增。但是,如果该行只存在于其中一个文件中,则$ hash {matchline}的值== 1,因为只有一个while循环将增加该值而不是另一个。
另外,Lajos Veres提出了一个非常重要的观点:如果某个单词,说“Tom”在同一个文件中出现两次,那么该算法将失败。这是一个微妙的细节,可以通过多种方式解决 - 事先删除重复,使用两个哈希等。
希望这有帮助。