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

Hi Monks!

How and the best way to loop an array of hashes to print its keys and values:
#!/usr/bin/perl use strict; use warnings; use Data::Dumper; my $people = [ { 'firstname' => ' InReach', 'companyid' => 1042, 'type' => 'client', 'lastname' => 'IT Solutions', 'id' => 1498, 'companyname' => 'InReach IT Solutions' }, { 'firstname' => ' Neil', 'companyid' => 1589, 'type' => 'client', 'lastname' => 'Ssmith', 'id' => 3132, 'companyname' => 'White Staffing Management' }, { 'firstname' => 'Zeeshan', 'companyid' => 1867, 'type' => 'client', 'lastname' => 'Jones', 'id' => 4174, 'companyname' => 'Staff247' } ]; ...


Thanks for helping!

Replies are listed 'Best First'.
Re: Looping through an array of hashes
by Athanasius (Archbishop) on Jul 02, 2018 at 13:58 UTC

    Assuming the hash keys are always the same (and known in advance), here is one straightforward way:

    use strict; use warnings; my $people = [ { 'firstname' => ' InReach', 'companyid' => 1042, 'type' => 'client', 'lastname' => 'IT Solutions', 'id' => 1498, 'companyname' => 'InReach IT Solutions' }, { 'firstname' => ' Neil', 'companyid' => 1589, 'type' => 'client', 'lastname' => 'Ssmith', 'id' => 3132, 'companyname' => 'White Staffing Management' }, { 'firstname' => 'Zeeshan', 'companyid' => 1867, 'type' => 'client', 'lastname' => 'Jones', 'id' => 4174, 'companyname' => 'Staff247' } ]; my @keys = qw( firstname companyid type lastname id companyname ); for my $hash (@$people) { print "\n"; for my $key (@keys) { printf "%11s: %s\n", $key, $hash->{$key}; } }

    Output:

    23:55 >perl 1902_SoPW.pl firstname: InReach companyid: 1042 type: client lastname: IT Solutions id: 1498 companyname: InReach IT Solutions firstname: Neil companyid: 1589 type: client lastname: Ssmith id: 3132 companyname: White Staffing Management firstname: Zeeshan companyid: 1867 type: client lastname: Jones id: 4174 companyname: Staff247 23:55 >

    Hope that helps,

    Athanasius <°(((><contra mundum Iustus alius egestas vitae, eros Piratica,

      A slight change lets me get all keys for any array of hashes. I added the sort just for fun.

      use strict; use warnings; my $people = [ { 'firstname' => ' InReach', 'companyid' => 1042, 'type' => 'client', 'lastname' => 'IT Solutions', 'id' => 1498, 'companyname' => 'InReach IT Solutions' }, { 'firstname' => ' Neil', 'companyid' => 1589, 'type' => 'client', 'lastname' => 'Ssmith', 'id' => 3132, 'companyname' => 'White Staffing Management' }, { 'firstname' => 'Zeeshan', 'companyid' => 1867, 'type' => 'client', 'lastname' => 'Jones', 'id' => 4174, 'companyname' => 'Staff247' }, { 'firstname' => 'Alex', 'companyid' => 1867, 'type' => 'client', 'lastname' => 'Jones', 'id' => 4175, 'companyname' => 'Staff248' }, ]; foreach my $hash (@$people){ print_hash ($hash); } print '*'x79, "\n"; #sort by lastname then firstname foreach my $hash (sort { $a->{lastname} cmp $b->{lastname} or $a->{fir +stname} cmp $b->{firstname} } @$people) { print_hash ($hash); } sub print_hash { my $hr = shift; print "\n"; foreach my $key (keys %$hr){ printf "%11s: %s\n", $key, $hr->{$key}; } }