use strict ;
use warnings ;
use Data::Dumper ;
my %hash_origin = ( 'key1' => 1, 'key2' => 1, 'key3' => 1 ) ;
my @keys = qw( key1 key1 key2 key2 key2 ) ;
my %hash ;
foreach ( @keys ) {
my $key = $_ ;
$hash{ $key } += $hash_origin{ $key } ;
}
print Dumper( \%hash ) ;
__END__
$VAR1 = {
'key1' => 2,
'key2' => 3
};
####
my %hash2 ;
my @keys_origin = keys %hash_origin ;
@hash2{@keys_origin} = (0) x @keys_origin ;
foreach ( @keys ) {
my $key = $_ ;
if ( exists $hash2{ $key } ) {
$hash2{ $key } += $hash_origin{ $key } ;
}
}
print Dumper( \%hash2 ) ;
__END__
$VAR1 = {
'key3' => 0,
'key2' => 3,
'key1' => 2
};
####
my %hash3_origin = ( 'key1' => [1, 2], 'key2' => [3, 4], 'key3' => [5, 6] ) ;
my @keys3_0 = qw( key1 key1 key2 key2 key2 ) ;
my @keys3_1 = qw( key2 key3 key3 key3 key3 ) ;
my %hash3 ;
my @keys3_origin = keys %hash3_origin ;
@hash3{@keys3_origin} = ([0, 0]) x @keys3_origin ;
foreach ( @keys3_0 ) {
my $key = $_ ;
$hash3{ $key }->[0] += $hash3_origin{ $key }->[0] ;
}
foreach ( @keys3_1 ) {
my $key = $_ ;
$hash3{ $key }->[1] += $hash3_origin{ $key }->[1] ;
}
print Dumper( \%hash3 ) ;
__END__
$VAR1 = {
'key3' => [
11,
28
],
'key1' => $VAR1->{'key3'},
'key2' => $VAR1->{'key3'}
};
####
@hash3{@keys3_origin} = ([0, 0]) x @keys3_origin ;
####
@hash3{@keys3_origin} = map [($_) x 2], (0) x @keys3_origin ;
####
@hash3{@keys3_origin} = ((0, 0)) x @keys3_origin ;
or
@hash3{@keys3_origin} = (@{[0, 0]}) x @keys3_origin ;