Taking References to Hashes (Perl Cookbook, 2nd Edition)

## 11.3. Taking References to Hashes

### 11.3.1. 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.

### 11.3.2. 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";
>     }

### 11.3.3. Discussion

This example prints out all keys and values from two predefined hashes:

>     foreach $href ( \%ENV, \%INC ) {       # OR: for $href ( \(%ENV,%INC) ) {
>         foreach $key ( keys %$href ) {
>             print "$key => $href->{$key}\n";
>         }
>     }

Access slices of hashes by reference as you'd access 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
>     }

### 11.3.4. See Also

The Introductionin Chapter 5; Chapter 8 of Programming Perl; perlref(1); Recipe 11.9

Copyright © 2003 O'Reilly & Associates. All rights reserved.