sub iterate_hash { my $ref = shift; foreach (keys %$ref) { if (ref($ref->{$_}) eq "HASH") { iterate_hash($ref->{$_}) } if (ref($ref->{$_}) eq "ARRAY" ) { iterate_array($ref->{$_})} else { print "$_ maps to $ref->{$_}\n" } } } sub iterate_array { my $ref = shift; foreach (@$ref) { if (ref($_) eq "HASH") { iterate_hash($_) } if (ref($_) eq "ARRAY" ) { iterate_array($_) } else { print "Array: $_\n" } } } &iterate_hash(\%vh);