2015-09-28 18 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; 

后者保持秩序。

相关问题