在perl中查找匹配和不匹配的值

在perl中查找匹配和不匹配的值,perl,Perl,我是编程新手,希望有人能向我解释: 因此,我有两个文本文件,即Scan1.txt和Scan2.txt,存储在我的计算机中。Scan1.txt包含: Tom white black mark john ben bob ben white gary tom black patrick Scan2.txt包含: Tom white black mark john ben bob ben white gary tom black patrick 我必须提取这两个文件的匹配值和不匹配值,并分别打印

我是编程新手,希望有人能向我解释:

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

Tom
white
black
mark
john
ben
bob
ben
white
gary
tom
black
patrick
Scan2.txt包含:

Tom
white
black
mark
john
ben
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";
open(F1,“Scan1.txt”);
打开(F2,“Scan2.txt”);
%散列=();
而($matchline=){
$hash{$matchline}=1;
} 
关闭F1;
而($matchline=){
$hash{$matchline}++;
}
关闭F2;
foreach$matchline(关键字%hash){
if($hash{$matchline}==1){
chomp($matchline);
推送(@unmatched,$matchline);
}
否则{
chomp($matchline);
推送(@matched,$matchline);
}
}
打印“匹配的条目为>>\n”;
打印“`````````````\n”;
打印联接(“\n”,@matched)。“\n”;
打印“`````````````\n”;
打印“不匹配的条目为>>\n”;
打印“`````````````\n”;
打印联接(“\n”,@不匹配)。“\n”;
打印“`````````````\n”;

如果给定的单词在第二个文件中存在不止一次,而在第一个文件中不存在,那么您上面提到的代码将给出错误的结果

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

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

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


$hash本身是一组计数器。

问题的更一般化版本是计算两个集合之间的集合并集或交集。这在总体上很好地解决了这个问题

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

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

希望这有帮助