2015-09-28 67 views
0
my %seen; 
    @seen{@sender} =(); 
    my @merged = (@sender, grep{!exists $seen{$_}} @receiver); 


    my $c1 = @merged; 
    print $c1, "\n"; 


    @hash{@merged} =(); 
    my @email = keys %hash; 

    my $c2 = @email; 

    print $c2, "\n"; 

這是我爲此目的在標題中編寫的代碼的一部分。我想使用一組元素作爲哈希鍵,但某些鍵缺失

c1打印1409,而c2只打印493. 我想知道哪裏出錯了,差不多有1000個元素丟失(不在密鑰中的散列)?

或者,如果我這樣做:

foreach (@merged) { 
     $hash{$_} =(); 
    } 
    # @hash{@merged} =(); 
    my @email = keys %hash; 

分配鍵,它仍然只給了我493項,幾乎失蹤1000人。

謝謝。

+0

您好像在'@ sender'或'@ receiver'中重複了一遍。 (在'@ sender'中重複將增加'c1';在'@ receiver'中重複將增加'c2'。) – Amadan

+0

是的。但我想要實現的是:首先,合併「發送者」(1000個值)和「接收者」(1000個值)並消除重複,這會創建具有1409個值(小於2000)的「合併」。其次,將這些1409值用作「散列」的鍵。 –

+0

但「消除重複」無法正常工作。例如,如果'@ sender'具有'(「a」,「a」,「a」)和'@ receiver'具有'(「a」,「a」)'',那麼您會期望合併或者'(「a」)'(dedup)或'(「a」,「a」,「a」,「a」,「a」)'(無重複數據刪除);你有'(「a」,「a」,「a」)',這給你的差異。當你使用它們作爲散列鍵時,這會執行適當的重複數據刪除操作,並且只剩下'(「a」)','c1'和'c2'之間的差異爲2。 – Amadan

回答

2
my %seen; 
@seen{@sender} =(); 
my @merged = (@sender, grep{!exists $seen{$_}} @receiver); 

混合了兩種找到唯一值的方法,但沒有做出正確的選擇。要獲得唯一值,上述改變

my %seen; 
@seen{@sender} =(); 
@seen{@receiver} =(); 
my @merged = keys(%seen); 

my %seen; 
my @merged = grep !$seen{$_}++, @sender, @receiver; 

後者保持秩序。