2011-07-05 46 views
2

如果我有喜歡這些如何將密鑰從散列複製到數組而不重複?

#!/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不適用於數組?

回答

5

你可以利用List::MoreUtilsuniq功能:

use List::MoreUtils qw(uniq); 

@a = uniq @a, keys %h; 
+0

這是@a和鍵%h的聯合;她可能想要一個十字路口? – ysth

+0

我不認爲她打算交叉口。相關部分:'@ a'_包含_'%h'的所有關鍵字。 –

5

轉換你想成爲哈希鍵的值,然後提取它們

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

或者只是'@a =鍵%{{map {$ _ => 1} @a,鍵%h}}' –

6

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

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

O therwise,List::Utilfirst可以幫助:

for my $key (keys %h) {   
    push @a, $key unless first { $_ eq $key } @a;  
} 
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;