use strict; use warnings; my ( %individuals_by_first_name, %individuals_by_middle_name); foreach my $line () { chomp($line); my ($first, $middle, $last, $age, $sex, $location) = split(/,/, $line); my $record = [ $first, $middle, $last, $age, $sex, $location ]; push(@{$individuals_by_first_name{$first}}, $record); push(@{$individuals_by_middle_name{$middle}}, $record); } foreach my $first (sort keys %individuals_by_first_name) { foreach my $individual (@{$individuals_by_first_name{$first}}) { my ($first, $middle, $last, $age, $sex, $location) = @$individual; print "$first: $middle, $last, $age, $sex, $location\n"; } } __DATA__ first1,middle1,last1,27,M,here first2,middle2,last2,56,M,there first3,middle3,last3,30,F,everywhere first1,middle4,last4,7,F,home first4,middle2,last3,22,M,away