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

时间:2013-09-29 00:37:23

标签: perl

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

所以我有两个文本文件,即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";

2 个答案:

答案 0 :(得分:0)

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

这一行: $哈希{$匹配线} ++ 为每个不同的单词递增一个不同的计数器。

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

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

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

答案 1 :(得分:0)

您的问题的更通用版本是计算两个集合之间的集合或交集。这个问题link可以很好地解决这个问题。

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

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

希望这有帮助。