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