17

私は2つのハッシュを持っています.1つは大きく、もう1つは小さいです。小さいハッシュのキーはすべて大きいハッシュに表示されますが、値は異なります。大きなハッシュから小さなハッシュに値をコピーしたい。

例えば:

# 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}; }

これを行うためのより短い方法はありますか?

4

3 に答える 3

23
@small_hash{ keys %small_hash } = @big_hash{ keys %small_hash };
于 2012-06-13T15:00:38.983 に答える
9

これがあなたがそれをすることができる方法です:

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

また、これはforループと非常によく似ています。

$small{$_} = $big{$_} for keys %small;

map 1つを必要とする人のための証拠:

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
于 2012-06-13T15:03:34.567 に答える
-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";
}
于 2012-06-13T14:56:52.263 に答える