如果我有像这样的数组和哈希
#!/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
对数组不起作用?
答案 0 :(得分:6)
如果你有Perl 5.10及更高版本,你可以使用智能匹配(~~
):
for my $key (keys %h) {
push @a, $key unless $key ~~ @a;
}
否则,List::Util
的{{1}}可以提供帮助:
first
答案 1 :(得分:5)
您可以使用List::MoreUtils
的uniq
功能:
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;