Use map. You might need to clone the hash if you don't want the input and output to share the inner structures.
#! /usr/bin/perl
use strict;
use warnings;
use Clone qw{ clone };
use Test::More tests => 2;
my $input_hash_ref = {
key1 => {
some_field => 'value1',
key => 'key1',
alt_key => 'alt_key1'
},
key2 => {
some_field => 'value2',
key => 'key2',
alt_key => 'alt_key2'
}
};
my $expected_hash_ref={
alt_key1 => {
some_field => 'value1',
key => 'key1',
alt_key => 'alt_key1'
},
alt_key2 => {
some_field => 'value2',
key => 'key2',
alt_key => 'alt_key2'
},
};
my $output_hash_ref = { map { $input_hash_ref->{$_}{alt_key} => $input
+_hash_ref->{$_} }
keys %$input_hash_ref };
is_deeply($output_hash_ref,
$expected_hash_ref,
'same inner hashes');
my $clone = clone($input_hash_ref);
my $cloned_hash_ref = { map { $clone->{$_}{alt_key} => $clone->{$_} }
keys %$clone };
is_deeply($cloned_hash_ref,
$expected_hash_ref,
'cloned');
|