How do I iterate through a reference to an array of hashes in Perl?

arrays, hash, perl, perl-data-structures

Solution

The arguments to Data::Dumper's `Dumper` function should be references. E.g.:

use Data::Dumper;
my @array = ([1,2,3], [11,22,33]); # Two-dimensional array
print Dumper @array;               # print array
print Dumper \@array;              # print reference to array

The output:

$VAR1 = [
          1,
          2,
          3
        ];
$VAR2 = [
          11,
          22,
          33
        ];

$VAR1 = [
          [
            1,
            2,
            3
          ],
          [
            11,
            22,
            33
          ]
        ];

The second print gives us the entire structure in one variable. When you print the array directly, it expands into all its elements, so...

print Dumper @array;

Is equivalent to:

print Dumper $array[0], $array[1], ..., $array[$#array];

So, in your case, just do:

sub mySub {
    my ($resultref) = @_;
    print Dumper $resultref;
}

Accessing the inner variables:

Just take a look at `Data::Dumper`'s output:

$VAR1 = [    # bracket denotes start of an array ref
          {  # curly brackets = hash ref
            'portName' => '1.1',
            'ips' => [
                       '192.168.1.242'
                     ],
            'switchIp' => '192.168.1.20',
            'macs' => [
                        '00:16:76:9e:63:47'
                      ]
          }, # hash ref ends, comma = new array element begins
          {  # new hash ref 
            'portName' => '1.10',
            'ips' => [
                       '192.168.1.119',
                       '192.168.1.3'
                     ],
            'switchIp' => '192.168.1.20',
            'macs' => [
                        'd0:67:e5:f8:7e:7e',
                        'd0:67:e5:f8:7e:76'
                      ]
          }, # end of hash
        ];   # end of array

Important to note here is that all elements of an array, and all the values of a hash are scalars. Therefore, all hashes and arrays can easily be broken up into a list of scalars.

for my $aref (@$resultref) {  # starting array ref
    for my $aref2 (@$aref) {  # second level array ref
        for my $href (@$aref2)  # here begins the hash
            local $\ = "\n";    # add newline to print for simplicity
            print $href->{portName};    # printing a scalar
            print for @{$href_>{ips}};  # printing an array ref w post-script loop
            print $href->{switchIp};
            print for @{$href->{macs}};
        }
    }
}

Note the use of the arrow operator to dereference a reference. If you have a hash or array you would do `$array[0]` or `$hash{$key}`, but by using a reference, you "point" to the address contained in the reference instead: `$array->[0]` or `$hash->{$key}`.

Problem

I have a reference to an array of hases that I pass to a subroutine in my perl script This is the code: ``` sub mySub { (my $resultref) = @_; my @list = @$resultref; print Dumper(@list); foreach my $result (@list) { print Dumper($result); } } ``` And this is the output: ``` $VAR1 = [ { 'portName' => '1.1', 'ips' => [ '192.168.1.242' ], 'switchIp' => '192.168.1.20', 'macs' => [ '00:16:76:9e:63:47' ] }, { 'portName' => '1.10', 'ips' => [ '192.168.1.119', '192.168.1.3' ], 'switchIp' => '192.168.1.20', 'macs' => [ 'd0:67:e5:f8:7e:7e', 'd0:67:e5:f8:7e:76' ] }, ]; $VAR1 = [ { 'portName' => '1.1', 'ips' => [ '192.168.1.242' ], 'switchIp' => '192.168.1.20', 'macs' => [ '00:16:76:9e:63:47' ] }, { 'portName' => '1.10', 'ips' => [ '192.168.1.119', '192.168.1.3' ], 'switchIp' => '192.168.1.20', 'macs' => [ 'd0:67:e5:f8:7e:7e', 'd0:67:e5:f8:7e:76' ] }, ]; ``` The loop is putting the whole array into the $result variable. I have tried dereferencing it as @$result[0] with no success. How do I loop those hashes individually? Thanks!

Original source