Hashes #2

#0 | #1 | #2 | #3 | #4 | #5 | #6 | #7

Like arrays of arrays, we can have hashes of hashes (or hashes of arrays), since a hash, like an array, is a collection of scalar quantities.

When we talk about hashes of hashes, arrays of arrays, etc. we are really talking about references. As you will learn, references are scalar objects that can also refer to other scalar objects - like arrays and hashes. We talk about them later. A good explanation is here.

If you are familiar with data structures, you may know about one called a record. A hash of hashes is like that - it is a record that itself contains other records.

Time for another example ...

my %HoH = (
    flintstones => {
        husband => "fred",
        pal     => "barney",
    },
    jetsons     => {
        husband     => "george",
        wife        => "jane",
        "his boy"   => "elroy", # quotes needed for spaces in key
    },
    simpsons    => {
        husband => "homer",
        wife    => "marge",
        kid     => "bart",
    },
);

To access various pieces of this record, the keys are used as the index to the values, similar to accessing an array.

for my $family (keys %HoH) {
    print "$family:\n";
    for my $role (keys %{ $HoH{$family} } ) {
        print "\t$role --> $HoH{$family}{$role}\n";
    }
    print "\n";
}

Again, note the hash is not sorted, but we can fix that.

for my $family (sort keys %HoH) {
    print "$family:\n";
    for my $role (sort keys %{ $HoH{$family} } ) {
        print "\t$role --> $HoH{$family}{$role}\n";
    }
    print "\n";
}

Note we are only sorting keys in this example.

Accessing individual values is straight-forward, since the index is the key. Here we are looking for the wife's name in the jetsons family:

print "$HoH{jetsons}{husband}'s wife is $HoH{jetsons}{wife}\n";

The syntax is similar to accessing an array, with one difference being the use of braces { } instead of brackets [ ].

Another example with some of my music ...