in reply to Re: Accessing hash elements inside another hash
in thread Accessing hash elements inside another hash

Sorry, made a mistake in putting code. Actually %queues is prepared and returned by a sub routine into %Data. So the code is -
my %Data = getQueues(); while (my ($key,$value) = each(%Data)){ #print "$key = $value \n"; for(my ($k,$v) = each($key->{'Queues'})){ print "$k = $v \n"; } }

Replies are listed 'Best First'.
Re^3: Accessing hash elements inside another hash
by jrsimmon (Hermit) on Mar 11, 2009 at 17:35 UTC
    You're use of $key in the inner loop is incorrect. It should be:
    my %Data = getQueues(); while (my ($key,$value) = each(%Data)){ #print "$key = $value \n"; for(my ($k,$v) = each($Data{$key}->{'Queues'})){ print "$k = $v \n"; } }
    In general, accessing all key/value pairs in a HoH will look like:
    foreach my $key (keys(%HoH)){ foreach my $otherKey (keys($HoH{$key})){ my $value = $HoH{$key}{$otherKey}; my $result = &DO_SOMETHING($value); } }
      You're use of $key in the inner loop is incorrect.

      Yours is too... a hash reference cannot be stored (directly) as a hash key, only as value. so that should look like

      my %Data = getQueues(); while (my ($key,$value) = each(%Data)){ #print "$key = $value \n"; for(my ($k,$v) = each(%$value)){ print "$k = $v \n"; } }

      although that snippet doesn't fit the OP's data structure, either. The following might work:

      while (my ($key,$value) = each(%Data)){ if (ref $value eq 'ARRAY') { for my $hashref (@$value) { print " $_ => $hashref->{$_}\n" for keys %$hashref; } } else { print "$key = $value \n"; }