2012-07-25 48 views
1

我見過一個簡單的程序。那麼,孔程序,我有了解,除了一兩件事,那就是如何哈希正在這裏:如何使用散列查找唯一項目

程序 - >從列表中提取獨特的元素

@list = (20,30,40,60,40,20,30,2); 
@uniq =(); 
%seen =(); 
foreach $item (@list) { 
    unless ($seen{$item}) 
    { 
     # if we get here, we have not seen it before 
     push(@uniq, $item); 
     $seen{$item}++; 

    } 
    print %seen; 
    print"\n"; 
} 

我的問題是如何散列從其退出的比較價值到當前的價值,即它是如何檢查天氣的價值已經存在或沒有。如果我印刷%看到我得到一些value.how這些價值即將到來?

回答

2

如果它使得它更清晰的你,改變

if (!$seen{$item}) { $seen{$item}++; ... } 

if (!exists($seen{$item})) { $seen{$item} = 1; ... } 

第一次遇到特定的項目,所以進入if不存在作爲哈希鍵。 if的主體在與項目相同的哈希中創建密鑰。

第二個(以及第三個和......)時間遇到特定項目時,它作爲密鑰存在於哈希中,因此不會輸入if


順便說一句,

if (!$seen{$item}) { $seen{$item}++; ... } 

可縮短至

if (!$seen{$item}++) { ... } 

而且

my @uniq; 
for my $item (@list) { 
    push @uniq, $item if ...; 
} 

可縮短至

my @uniq = grep ..., @list; 

所以整個事情可以寫爲

my @list = (20,30,40,60,40,20,30,2); 
my %seen; 
my @uniq = grep !$seen{$_}++, @list; 
+0

Thanku iKegami !! – Maverick 2012-07-25 18:02:14

+1

@ user1202644,如果這回答您的問題,請通過檢查最佳答案旁邊的標記來關閉它。如果沒有,請告訴我們缺少什麼。歡迎來到StackOverflow! :) – ikegami 2012-07-25 18:10:13

+0

@ ikegami,但我在哪裏可以找到「最佳答案」?對不起,但我找不到:( – Maverick 2012-07-26 14:35:15

0

$seen{$item}將是未定義的或數字。

$seen{$item}++;會使它成爲一個數字。

1

檢查unless ($seen{$item})探測密鑰$item的散列表。如果看到鑰匙,測試將失敗,因爲$seen{$item}將被定義並且不爲零。

如果在哈希表中沒有條目:

push(@uniq, $item); # store this item 
$seen{$item}++;  # and increment the value for this key in the hash table 

一個未定義的值被認爲是0,所以聲明$seen{$item}++使得它的值1(你還不如寫爲$seen{$item} = 1

如果該項目在列表中再次遇到時,unless ($seen{$item})不會成功的,所以它會被跳過。

+0

感謝Perreal這樣一個很好的解釋! – Maverick 2012-07-25 18:00:32