O'Reilly logo

Perl Cookbook by Nathan Torkington, Tom Christiansen

Stay ahead with the world's most comprehensive technology and business learning platform.

With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, tutorials, and more.

Start Free Trial

No credit card required

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

Section 5.0; Chapter 4 of Programming Perl ; perlref(1); Section 11.9

With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, interactive tutorials, and more.

Start Free Trial

No credit card required