Taking References to Hashes
Problem
You need to manipulate a hash by reference. This might be because it was passed into a function that way or because it's part of a larger data structure.
Solution
To get a hash reference:
$href = \%hash; $anon_hash = {
"key1" => "value1", "key2" => "value2", ... };
$anon_hash_copy = {
%hash };
To dereference a hash reference:
%hash = %$href; $value = $href->{$key};
@slice = @$href{$key1, $key2, $key3};
# note: no arrow! @keys = keys %$href;
To check whether something is a hash reference:
if (ref($someref) ne 'HASH') {
die "Expected a hash reference, not $someref\n";
}
Discussion
This example prints out all the keys and values in two predefined hashes:
foreach $href ( \%ENV, \%INC ) {
# OR: for $href ( \(%ENV,%INC) ) {
foreach $key ( keys %$href ) {
print "$key => $href->{$key}\n";
}
}
Accessing slices of hashes by reference works just as it does with slices of arrays by reference. For example:
@values = @$hash_ref{"key1", "key2", "key3"};
for $val (@$hash_ref{"key1", "key2", "key3"}) {
$val += 7; # add 7 to each value in hash slice
}
See Also
; of Perl Developing; perlref (1);