2011-07-05 7 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::MoreUtilsさんuniq機能を利用することができます

use List::MoreUtils qw(uniq); 

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

これは@aとキー%hの和集合です。彼女は交差点を望んでいるかもしれませんか? – ysth

+0

私は彼女が交差点を意図したとは思わない。関連セクション: '@ a' _すべてのキーを含む'%h'。 –

5

あなたは、あなたが後で5.10持っている場合は、それらに

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

または '@a = keys%{{map {$ _ => 1} @a、keys%h}}' –

6

を抽出し、ハッシュキーに必要な値を変換します

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; 
関連する問題