1

我是编程新手,希望有人可以向我解释一下:

所以我有两个文本文件,即 Scan1.txt 和 Scan2.txt 存储在我的计算机中。Scan1.txt 包含:

Tom
white
black
mark
john
ben

Scan2.txt 包含:

bob
ben
white
gary
tom
black
patrick

我必须提取这两个文件的匹配值和不匹配的值并分别打印。我以某种方式找到了解决方案,效果很好。但是有人可以解释一下比赛到底是怎么发生的。看起来有点像这一行: $hash{$matchline}++在代码中进行匹配并在找到匹配项时增加 hash 的值。我理解逻辑,但我不明白这场比赛是如何发生的。有人可以帮我理解这一点吗?

先感谢您!

这是代码:

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";
4

2 回答 2

0

如果给定的单词在第二个文件中多次存在并且在第一个文件中不存在,则您上面提到的代码会给您一个错误的结果。

这一行: $hash{$matchline}++ 为每个不同的单词增加一个不同的计数器。

在第一个循环中,它为第一个文件中的单词设置为 1。

因此,如果每个文件中都存在一个单词,则计数器至少为 2。

$hash 本身就是一组计数器。

于 2013-09-29T00:53:39.033 回答
0

您的问题的一个更通用的版本是计算两个集合之间的集合并集或交集。该链接总体上很好地解决了该问题。

在您的情况下,该集合只不过是每个文件中的值列表。逻辑是,如果两个文件中都存在某个值,则 $hash{matchline} == 2,因为该值将在两个 while 循环中递增。但是,如果该行仅存在于其中一个文件中,则 $hash{matchline} 的值 == 1,因为只有一个 while 循环会增加该值,而不会增加另一个。

此外,Lajos Veres 提出了一个非常重要的观点:如果某个单词,比如“Tom”,在同一个文件中出现两次,那么算法将失败。这是一个微妙的细节,可以通过多种方式解决——预先删除重复项、使用两个哈希等。

希望这可以帮助。

于 2013-09-29T05:44:51.367 回答