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

Hi Monks!
How do I access the element "NUMBER" from this hash?
... for my $key (sort keys %block) { my $number = $block{$key}{data}[3]; $ << Not working print $number; print Dumper @{$block{$key}{data}}; # Dump: <code> =code [ { BIRTH => "11/04/2014", CODE => 4, NAME => "JOHN D.", NUMBER => 1234, }, ] [ { BIRTH => "11/04/2014", CODE => 4, NAME => "JOHN D.", NUMBER => 1234, }, ] [ { BIRTH => "11/04/2014", CODE => 4, NAME => "JOHN D.", NUMBER => 1234, }, ] [ { BIRTH => "11/04/2014", CODE => 4, NAME => "JOHN D.", NUMBER => 1234, }, ] [ { BIRTH => "11/26/2014", CODE => 3, NAME => "MARY LEE", NUMBER => 55666, }, ] [ { BIRTH => "11/26/2014", CODE => 3, NAME => "MARY LEE", NUMBER => 55666, }, ] [ { BIRTH => "11/26/2014", CODE => 3, NAME => "MARY LEE", NUMBER => 55666, }, ] =cut
} </code>
Thanks!11/26/2014

Replies are listed 'Best First'.
Re: Accessing a hash element
by stevieb (Canon) on Nov 02, 2015 at 19:36 UTC

    You keep posting examples with completely broken and unusable data, which makes it nearly impossible to figure out what and why you're trying to do.

    Here's what I expect you're trying to do, but it's really a crap shoot here:

    use warnings; use strict; my $aref = [ { BIRTH => "11/04/2014", CODE => 4, NAME => "JOHN D.", NUMBER => 1234, }, { BIRTH => "11/04/2014", CODE => 4, NAME => "Mike D.", NUMBER => 1234, }, ]; for my $block (@$aref){ my $number = $block->{NUMBER}; print "$number\n"; }

    Why don't you state your overall objectives for the larger project, instead of repeated posts with code that won't compile and data that can't be used? Then, we might be able to give examples of long-term data structure, and how to use it.

    Update: if you do have an aoaoh, here's an example of how to get the NUMBER from the 1st hash in the 2nd array element:

    use warnings; use strict; my $arefs = [ [ { BIRTH => "11/04/2014", CODE => 4, NAME => "JOHN D.", NUMBER => 1234, }, ], [ { BIRTH => "11/04/2014", CODE => 4, NAME => "Mike D", NUMBER => 5555, }, ], ]; print "$arefs->[1][0]{NUMBER}\n";
      Hi, how could I remove a duplicated block from the same data structure?
      use warnings; use strict; my $arefs = [ [ { BIRTH => "11/04/2014", CODE => 4, NAME => "JOHN D.", NUMBER => 1234, }, ], [ { BIRTH => "11/04/2014", CODE => 4, NAME => "JOHN D.", NUMBER => 1234, }, ], [ { BIRTH => "11/04/2014", CODE => 4, NAME => "Mike D", NUMBER => 5555, }, ], ];

      Thanks!

        Data::Compare can do this. Here's one way:

        use warnings; use strict; use Data::Compare; use Data::Dumper; my $arefs = [ [ { BIRTH => "11/04/2014", CODE => 4, NAME => "JOHN D.", NUMBER => 1234, }, ], [ { BIRTH => "11/04/2014", CODE => 4, NAME => "JOHN D.", NUMBER => 1234, }, ], [ { BIRTH => "11/04/2014", CODE => 4, NAME => "Mike D", NUMBER => 5555, }, ], ]; my $no_dups_aref; while (my $aref = shift @$arefs){ my $dup = 0; for (@$arefs){ $dup = Compare($aref, $_); last if $dup; } next if $dup; push @$no_dups_aref, $aref; } print Dumper @$no_dups_aref;

        However, I'd be seriously inclined to change your data structure. There's no need to have nested arrays if all you have in each one only has a single hash. I'd dumb it down to a simple AoH:

        use warnings; use strict; use Data::Compare; use Data::Dumper; my $hrefs = [ { BIRTH => "11/04/2014", CODE => 4, NAME => "JOHN D.", NUMBER => 1234, }, { BIRTH => "11/04/2014", CODE => 4, NAME => "JOHN D.", NUMBER => 1234, }, { BIRTH => "11/04/2014", CODE => 4, NAME => "Mike D", NUMBER => 5555, }, ]; my $no_dups_aref; while (my $href = shift @$hrefs){ my $dup = 0; for (@$hrefs){ $dup = Compare($href, $_); last if $dup; } next if $dup; push @$no_dups_aref, $href; } print Dumper @$no_dups_aref;
Re: Accessing a hash element
by Preceptor (Deacon) on Nov 03, 2015 at 12:43 UTC

    Have you been using "XML::Simple"? This looks a lot like some XML that has been vandalised by that module.