在perl中查找匹配和不匹配的值
我是编程新手,希望有人能向我解释: 因此,我有两个文本文件,即Scan1.txt和Scan2.txt,存储在我的计算机中。Scan1.txt包含:在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 我必须提取这两个文件的匹配值和不匹配值,并分别打印
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”,在同一个文件中出现两次,那么算法将失败。这是一个微妙的细节,可以通过多种方式解决——事先删除重复项,使用两个哈希,等等 希望这有帮助