use Data::Dumper; use strict; my $var = [ { 'city' => 'New York', 'name' => 'Bill' }, { 'city' => 'New York', 'name' => 'Ronald' }, { 'city' => 'Boston', 'name' => 'George' } ]; my %result; push @{$result{$_->{city}}}, $_->{name} foreach (@$var); print Dumper(\%result);