2012-06-13 20 views
11

私は大きなものと小さいものの2つのハッシュを持っています。小さなハッシュのキーはすべて、より大きいハッシュに表示されますが、値は異なります。大きなハッシュの値を小さなハッシュにコピーしたい。perlのあるハッシュから別のハッシュへの値のコピー

EG:

# I have two hashes like so 
%big_hash = (A => '1', B => '2', C => '3', D => '4', E => '5'); 
%small_hash = (A => '0', B => '0', C => '0'); 
# I want small_hash to get the values of big_hash like this 
%small_hash = (A => '1', B => '2', C => '3'); 

明白な答えは、小さなハッシュのキーをループにすること、そしてこの

foreach $key (keys %small_hash) { $small_hash{$key} = $big_hash{$key}; } 

のような値をコピーしますが、これを行うために短い方法はあります?

%small = map { $_, $big{$_} } keys %small; 

Althoループのためにかなり似ています:

+2

あなたのコードを修正:ハッシュテーブルは一緒に行く '()'、のみハッシュテーブルの参照が行きます'{} 'で終わります。 – Lumi

+0

申し訳ありませんが、修正されました。 –

答えて

16
@small_hash{ keys %small_hash } = @big_hash{ keys %small_hash }; 
+0

'keys%hash 'の順序は呼び出し間で変更されないと仮定するのは正しいでしょうが、それは保証できますか? – Qtax

+1

OPは次のよ​​うに書いています。「より大きなハッシュの値をより小さなハッシュにコピーしたい。 '%small_hash'に含まれているキーの値だけをコピーしたいと仮定した場合、これが正しい解です。 – Lumi

+0

はい、 'keys'の順序は変更されないことが保証されています。 – mob

-2
use strict; 
my %source = (a => 1, b => 2, c => 3); 
my %target = (a => -1, x => 7, y => 9); 

# Use a hash slice for the copy operation. 
# Note this will clobber existing values. 
# Which is probably what you intend here. 
@target{ keys %source } = values %source; 

for (sort keys %target) { 
    print $_, "\t", $target{ $_ }, "\n"; 
} 
+0

動作しません、ソースにはより多くの値があり、OPは同じキーの値をコピーするだけでした。 – Qtax

+0

@ Qtax - もちろん動作します。 '%source'の値の数は無関係です。そして、 "異なるハッシュ間で同じ順序"についてのあなたのコメントは意味をなさない:ハッシュテーブルは順序付けられていない。私があなたが指していると思うのは、代入の順序であり、同じハッシュテーブルの 'keys'と' values'の両方で同一であることが保証されています。サンプルを実行し、それから考えてみましょう。それからポストするかもしれない。 – Lumi

+0

OPと同じハッシュで試してみて、望みの結果が得られたら自分自身で見てみませんか? – Qtax

6

は、ここであなたがそれを行うことができます方法です。

$small{$_} = $big{$_} for keys %small; 
1を必要とする人のため

mapproof

my %big = (A => '1', B => '2', C => '3', D => '4', E => '5'); 
my %small = (A => '0', B => '0', C => '0'); 

%small = map { $_, $big{$_} } keys %small; 

print join ', ', %small; 

出力:

A, 1, C, 3, B, 2 
+0

値をあるテーブルから別のテーブルにコピーするために必要な 'map'演算子はありません。 – Lumi

+0

@Lumi、地図の仕組みが分かりません。この回答は、必要に応じて機能します。あなたが投票を開始する前に、少なくとも試してみてください。 – Qtax

+0

@ Lumi、proof http://ideone.com/1PjLI礼儀正しく、正しい答えに投票してください。 – Qtax

関連する問題