use warnings; use strict; my %data; foreach my $string ( 'flinstones,fred,barney,willma,betty', 'flinstones,dino', 'doe,joe,jane', ) { my @family = split(/\s*,\s*/, $string); my $surname = shift @family; push @{$data{$surname}}, [ @family ]; } # use Data::Dumper; # print Dumper(\%data); foreach my $surname (keys %data) { my $somearray = $data{$surname}; foreach my $family (@$somearray) { foreach my $given (@$family) { print("$given $surname\n"); } print("--", "\n"); } } #### joe doe jane doe -- fred flinstones barney flinstones willma flinstones betty flinstones -- dino flinstones --