2013-09-29 88 views
1

我是一个新手,编程,我希望有人可以给我讲解一下:要找到在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"; 

回答

0

你在上面提到,如果给定单词​​存在于第二档以上的时间,而不是存在于第一个会给你一个假的结果的代码。

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

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

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

的$哈希本身是一组计数器。

0

您问题的更一般化版本是计算两个集之间的集合联合或交集的。一般而言,这个link给出了一个很好的处理问题。

在你的情况下,该集只不过是每个文件的值列表。逻辑是,如果两个文件中都存在一个特定的值,那么$ hash {matchline} == 2,因为这个值将在两个while循环中递增。但是,如果该行仅存在于其中一个文件中,$ hash {matchline} == 1的值,因为只有一个while循环将增加值而不是另一个。另外,Lajos Veres提出了一个非常重要的观点:如果某个词在同一个文件中出现了两次,那么算法就会失败。这是一个微妙的细节,可以通过多种方式解决 - 预先删除重复项,使用两个哈希等。

希望这会有所帮助。