如何将密钥从哈希复制到数组而不重复?

时间:2011-07-05 14:27:18

标签: perl

如果我有像这样的数组和哈希

#!/usr/bin/perl
use warnings;
use strict;
use Data::Dumper;

my @a = qw/a b c d e/;
my %h = (a => 1, b => 1, f => 1, g => 1);

我希望@a包含来自%h的所有密钥,并且数组中的任何元素都不得出现多次。

如何做到这一点,因为exists对数组不起作用?

4 个答案:

答案 0 :(得分:6)

如果你有Perl 5.10及更高版本,你可以使用智能匹配(~~):

for my $key (keys %h) {        
    push @a, $key unless $key ~~ @a;      
}

否则,List::Util的{​​{1}}可以提供帮助:

first

答案 1 :(得分:5)

您可以使用List::MoreUtilsuniq功能:

use List::MoreUtils qw( uniq );

@a = uniq @a, keys %h;

答案 2 :(得分:5)

将所需的值转换为哈希键,然后提取它们

my %foo = map { $_ => 1  } @a, keys %h;
print sort keys %foo;

答案 3 :(得分:4)

这个怎么样(肯定是对%h的破坏性):

delete @h{ @a }; # delete all keys of h already in @a
push @a, keys %h; # push remaining keys onto @a

因此@a保留了它所拥有的顺序,只需在%h中附加非重复键即可。

关于破坏性的一句话:上面的例子说明了当你能够承担破坏性时可以做些什么的一些概念。而删除肯定不会超出词汇变量的范围。

只需将哈希值缩小到@a中未找到的密钥,然后将其复制到另一个哈希值即可解决此问题。

my %h2 = %h;
delete @h2{ @a };
push @a, keys %h2;
相关问题