http://qs1969.pair.com?node_id=1019720


in reply to Iterate over a perl nested hash data structure

In perl, if we want to get the key/value pairs of hash, you can use the following code.

use strict; use warnings; # initializing hash with three four-value pairs, among those two are h +aving inner hashes ( Numerals, Alpha ) which have three key-value pai +rs in-built my %hash = ( 'Numerals' => { '1' => 'One', '2' => 'Two', '3' => 'Three', }, 'Alpha' => { 'A' => 'Apple', 'B' => 'Ball', 'C' => 'Cat' }, 'I' => 'Roman One', 'II' => 'Roman Two' );<br/> # for getting key-value pairs of above hash foreach(keys%$hash) { # by default key stored in $_ as per above foreach statement # checks whether value of hash is another hash if(ref($hash{$_}) eq 'HASH') { # iterate the keys set of inner hash foreach my $inner_key (keys%{$hash{$_}}) { # printing key and value of inner hash print "Key:$inner_key and value:$hash{$_}{$inner_key}\n"; } } else { print "Key: $_ and Value: $hash{$_}\n" } }

Replies are listed 'Best First'.
Re^2: Iterate over a perl nested hash data structure
by NewLondonPerl1 (Acolyte) on Feb 20, 2013 at 07:20 UTC
    Thanks ever so much for your help :-) I will try this out

      Sorry guys I still can't get this working. I all tried all the examples. This is a small sample of the data that is dumped via data::dumper

      $VAR1 = 'tag'; $VAR2 = { 'dev' => [ { 'nfsmount' => { 'bigstor_nfs' => {

      I am putting all of this data into a hash but when I print the keys in the hash all I can print out is 'dev' and 'tag'. I want to get past the point where the right [ bracket is (which is array called 'dev'). Below 'nfsmount' I have about 50 different hashes defined, one of which is called 'bigstor_nfs'. I want to be able to search through all the available hashes and depending on what the name of the hash is I then want print out all the key/values contained within each hash and output this to another file.

        So for instance I want to read the hash and do something like this. If find hash called 'bigstor_nfs' then print out to another file all the key/value pairs. then carry on to the next hash name at this level in the data structure. If thats called 'test_nfs' then print out all the key/values pairs to the same output file and then continue doing this comparing the names of each hash until the end of the data structure I think this is possible. I have tried so may different ways and I cant get this to work. Please can you help me?