2012-11-06 90 views
2

的關鍵,我有以下代碼刪除重複值在哈希

chdir("c:/perl/normalized"); 
$docid=0; 
my %hash =(); 
@files = <*>; 
foreach $file (@files) 
    { 
    $docid++; 
    open (input, $file);  
    while (<input>) 
     { 
    open (output,'>>c:/perl/tokens/total'); 
    chomp; 
    (@words) = split(" "); 
    foreach $word (@words) 
    { 
    push @{ $hash{$word} }, $docid; 

    } 
     } 
    } 
foreach $key (sort keys %hash) { 
    print output"$key : @{ $hash{$key} }\n"; 
} 


close (input); 
close (output); 

這是一個文件的示例輸出

of : 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 3 3 4 4 4 4 5 6 6 7 7 7 7 7 7 7 7 7 

這是因爲例如存在「的」一詞真然而,在第一個文檔 中有10(10個)倍的時間,有沒有辦法去除重複的值;即,而不是十分的人我想只是一個 謝謝您的幫助

+0

添加它之前,檢查它是否已經在哈希值。或者我在這裏錯過了什麼? – Madbreaks

+0

它已被[問之前](http://stackoverflow.com/questions/7651/how-do-i-remove-duplicate-items-from-an-array-in-perl)。請在發佈另一個同樣的問題之前進行搜索。 – hd1

回答

4

爲了避免在首位加複本,改變

foreach $word (@words) 

foreach $word (uniq @words) 

如果您想要離開數據結構中的dups,改爲

print output"$key : @{ $hash{$key} }\n"; 

print output "$key : ", join(" ", uniq @{ $hash{$key} }), "\n"; 

uniq由表:: MoreUtils提供。

use List::MoreUtils qw(uniq); 

或者你可以使用

sub uniq { my %seen; grep !$seen{$_}++, @_ } 
+0

非常感謝你的工作 – user1804029

+0

有沒有辦法保留刪除重複項的計數器? – user1804029

+0

最好的辦法可能是使用散列而不是數組,並將計數保持爲散列的值。 '++ $ hash {$ word} {$ docid};'使用'keys'來獲取文檔ID。您將失去訂單,但可以使用數字排序輕鬆恢復。 – ikegami