chandraspola has asked for the wisdom of the Perl Monks concerning the following question:

Hi Perl Monks, I am a bigener in Perl and trying the following code in Perl References to retrieve the data from the formed Hash of Hashes. Can you please help me out in solving the below problem

#The Below code discusses the handling of Complex data using Hash of H +ashes. #!/usr/bin/perl use Data::Dumper; $hohref = {}; $hohref->{"h1"}={}; $hohref->{"names"}={"name1"=>"Chandra"}; $epout = rand(9); $tcid = substr($epout,4,9); $hohref->{$tcid}={"TCDesc" => "Login Test", "TCRun"=>"Yes","TCResult"= +>"Pass"}; %tch = %$hohref; @k = keys(%tch); @v = values(%tch); print "The keys of ******* @k","\n"; print "The values of ******* @v ","\n"; #Dereferencing Hash of Hashes using foreach loops %och = %$hohref; foreach(keys(%och)){ print "The key outer hash \t".$_."\t The value outer hash ".$$ +och{$_}; print "\n"; if(ref($och{$_}) eq "HASH"){ %inner = %$och->{$_}; foreach(keys(%inner)){ print "The key is ".$_." ===>"."The value is $inner{$_ +}"; print "\n"; } } } #Dereferencing using Dumper function is working print Dumper($hohref),"\n";

Replies are listed 'Best First'.
Re: Retriving data from Hash of Hashes
by choroba (Cardinal) on Apr 19, 2015 at 07:57 UTC
    Dereferencing is needed only for references. If %och is a hash, $$och{$_} is not related to it - it dereferences the $och variable. Use strict so Perl can catch this kind of errors for you.
    #!/usr/bin/perl use warnings; use strict; use Data::Dumper; my $hohref; # No need to specify empty hash. $hohref->{h1} = {}; # Perl "autovivifies" the undefined reference. $hohref->{names} = { name1 => 'Chandra' }; my $epout = rand 9; my $tcid = substr $epout, 4, 9; $hohref->{$tcid} = { TCDesc => 'Login Test', TCRun => 'Yes', TCResult => 'Pass', }; my %tch = %$hohref; my @k = keys(%tch); my @v = values(%tch); print "The keys of ******* @k","\n"; print "The values of ******* @v ","\n"; my %och = %$hohref; for my $k (keys %och) { print "The key outer hash \t$k\t The value outer hash $och{$k}\n"; if('HASH' eq ref $och{$k}) { my %inner = %{ $och{$k} }; for (keys %inner) { print "The key is $_ ===> The value is $inner{$_}\n"; } } } print Dumper($hohref);
    لսႽ† ᥲᥒ⚪⟊Ⴙᘓᖇ Ꮅᘓᖇ⎱ Ⴙᥲ𝇋ƙᘓᖇ
Re: Retriving data from Hash of Hashes
by pme (Monsignor) on Apr 19, 2015 at 08:20 UTC
    Hi chandraspola,

    Welcome to the monastery.

    I changed your code a little and I hope that might help you. I also suggest to read perllol and perlreftut.

    #!/usr/bin/perl use Data::Dumper; $hohref = {}; $hohref->{"h1"}={}; $hohref->{"names"}={"name1"=>"Chandra"}; $epout = rand(9); $tcid = substr($epout,4,9); $hohref->{$tcid}={"TCDesc" => "Login Test", "TCRun"=>"Yes","TCResult"= +>"Pass"}; #Dereferencing Hash of Hashes using foreach loops foreach my $k1 (keys %$hohref) { print "The key outer hash $k1 The value outer hash $hohref->{$k1}\n" +; if (ref($hohref->{$k1}) eq "HASH") { foreach my $k2 (keys %{$hohref->{$k1}}) { print "The key is $k2 ===> The value is $hohref->{$k1}->{$k2}\n" +; } } } #Dereferencing using Dumper function is working print Dumper($hohref),"\n";
Re: Retriving data from Hash of Hashes
by ww (Archbishop) on Apr 19, 2015 at 11:36 UTC
      ... Simon Cozens' "Hash Crash Course" ...

      The code
          @popular =
              (sort { $histogram{$b} <=> $histogram{$b} } @unique)[0..4];
      in the "Counting" section should be
          @popular =
              (sort { $histogram{$b} <=> $histogram{$a} } @unique)[0..4];


      Give a man a fish:  <%-(-(-(-<