2013-09-29 130 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提出了一個非常重要的觀點:如果某個詞在同一個文件中出現了兩次,那麼算法就會失敗。這是一個微妙的細節,可以通過多種方式解決 - 預先刪除重複項,使用兩個哈希等。

希望這會有所幫助。