Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Perl hash of hashes of hashes of hashes... is there an 'easy' way to get an element at the end of the list?

I have a Perl hash of hashes of ... around 11 or 12 elements deep. Please forgive me for not repeating the structure below!

Some of the levels have fixed labels, e.g. 'NAMES', 'AGES' or similar so accessing these levels are fine as I can use the labels directly, but I need to loop over the other variables which results in some very long statements. This is an example of half of one set of loops:

foreach my $person (sort keys %$people) {
        foreach my $name (sort keys %{$people->{$person}{'NAMES'}}) {
            foreach my $age (sort keys %{$people->{$person}{'NAMES'}{$name}{'AGES'}}) {
                . . . # and so on until I get to the push @list,$element; part

This is just an example, but it follows the structure of the one I have. It might be shorter not to have the fixed name sections (elements in caps) but they are required for reference purposes else where.

I tried to cast the elements as hashes to shorten it at each stage, e.g. for the second foreach I tried various forms of:

foreach my $name (sort keys %{$person->{'NAMES'}})

but this didn't work. I'm sure I've seen something similar before, so the semantics may be incorrect.

I've studied pages regarding Hash of Hashes and references to hashes and their elements and so on without luck. I've seen examples of while each loops but they don't seem to be particularly shorter or easier to implement. Maybe there is just a different method of doing this and I'm missing the point. I've written out the full set of foreach loops once and it would be great if I don't have to repeat it another six times or so.

Of course, there may be no 'easy' way, but all help appreciated!

like image 740
dgBP Avatar asked Nov 15 '12 17:11

dgBP


People also ask

How do I get the hash element in Perl?

Perl Hash Accessing To access single element of hash, ($) sign is used before the variable name. And then key element is written inside {} braces.

Are Perl hashes ordered?

Note that hashes in Perl are not ordered. This means that when you iterate over a hash, you may not extract the values in the same order in which they were inserted. The values stored in a hash can of type integer, float, string, boolean, arrays and hash itself.

How do I read a hash file in Perl?

use Data::Dumper; use File::Slurp; my %hash = read_file("output.pl"); print Dumper(keys(%hash));

How do I create an array of hash in Perl?

To assign that array to a hash element, you'd use either $b{"x"} = [@a] or $b{"x"} = \@a , depending on what you're trying to do. [@a] makes a new arrayref containing a copy of the current contents of @a . If the contents of @a change after that, it has no effect on $b{x} .


1 Answers

$person is the key, to shorten things for the inner loops you need to assign the value to something:

foreach my $person_key (sort keys %$people) {
    my $person = $people->{$person_key};
    my $names  = $person->{NAMES};
    foreach my $name (sort keys %$names) {
like image 51
RobEarl Avatar answered Sep 24 '22 22:09

RobEarl