如果我有喜歡這些如何將密鑰從散列複製到數組而不重複?
#!/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);
陣列和散列,我想用含有從%h
所有鍵的@a
落得,並且陣列中沒有元素必須出現一次以上。
如何做到這一點,因爲exists
不適用於數組?
如果我有喜歡這些如何將密鑰從散列複製到數組而不重複?
#!/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);
陣列和散列,我想用含有從%h
所有鍵的@a
落得,並且陣列中沒有元素必須出現一次以上。
如何做到這一點,因爲exists
不適用於數組?
你可以利用List::MoreUtils
的uniq
功能:
use List::MoreUtils qw(uniq);
@a = uniq @a, keys %h;
轉換你想成爲哈希鍵的值,然後提取它們
my %foo = map { $_ => 1 } @a, keys %h;
print sort keys %foo;
或者只是'@a =鍵%{{map {$ _ => 1} @a,鍵%h}}' –
如果你有Perl 5.10或更高版本,可以使用智能匹配(~~
):
for my $key (keys %h) {
push @a, $key unless $key ~~ @a;
}
O therwise,List::Util
的first
可以幫助:
for my $key (keys %h) {
push @a, $key unless first { $_ eq $key } @a;
}
這個怎麼樣(當然破壞性`%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;
這是@a和鍵%h的聯合;她可能想要一個十字路口? – ysth
我不認爲她打算交叉口。相關部分:'@ a'_包含_'%h'的所有關鍵字。 –