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

Hi Experts,

Need help on printing data from hashes

I have stored the sum of values in a hash as shown below

hash output

'1' => { 'Val1' => '13.12' }, '2' => { 'Val1' => '6' }, '3' => { 'Val1' => '2' }, '4' => { 'Val1' => '15.52' } };

I am expecting output as below

Total 36.64

please let me know the syntax

Thanks

Replies are listed 'Best First'.
Re: Hashes - perl
by toolic (Bishop) on Oct 19, 2013 at 20:26 UTC
Re: Hashes - perl
by aitap (Curate) on Oct 19, 2013 at 21:43 UTC
    Use map to traverse values of your hash and get the Val1 values from them, sum them afterwards.
Re: Hashes - perl
by NetWallah (Canon) on Oct 19, 2013 at 20:48 UTC
    It is always helpful to show what you tried, even if it fails.

    That way, we can help you understand how to do it better.

    my $total = 0; for my $v ( values %Your_Hash_name ){ $total += $v; } # Can also be written as: # $total += $_ for values %Your_Hash_Name; print "Total: $total\n";
    Update: I did not notice the second level of hash in the OP - see AnomalousMonk's (++) more correct answer below, for 2 levels of hashes.

                 When in doubt, mumble; when in trouble, delegate; when in charge, ponder. -- James H. Boren

      for my $v ( values %Your_Hash_name ){ $total += $v; }

      Does not sum the data as presented in OPed data structure (seems to be summing the hash reference addresses).

      >perl -wMstrict -le "my %hash = ( '1' => { 'Val1' => '13.12' }, '2' => { 'Val1' => '6' }, '3' => { 'Val1' => '2' }, '4' => { 'Val1' => '15.52' }, ); ;; my $total = 0; for my $v (values %hash) { $total += $v; } print $total; ;; $total = 0; for my $v (values %hash) { $total += $v->{Val1} } print $total; " 73273728 36.64

      Update: Or, per aitap's approach:

      >perl -wMstrict -le "use List::Util qw(sum); ;; my %hash = ( '1' => { 'Val1' => '13.12' }, '2' => { 'Val1' => '6' }, '3' => { 'Val1' => '2' }, '4' => { 'Val1' => '15.52' }, ); ;; my $total = sum map $_->{Val1}, values %hash; print $total; " 36.64