use warnings; use strict; my %people; my %families; while() { chomp; my ($family, $people) = split /=/, $_, 2; #split into two: family and memebers my @members = split /,\s*/, $people, -1; #split family line into an array foreach my $member (@members) { #foreach member within array push @{$people{$member}}, $family; #push into an array } push @{$families{$family}}, @members; } my $total_families = keys %families; my $total_people = 0; $total_people += @{$families{$_}} for keys %families; print "Num Families: $total_families\n"; print "Num People: $total_people\n"; print "All given Names: ", join (' ', sort keys %people), "\n"; print "All family names: ", join (' ', sort keys %families), "\n"; print "All names grouped by family:\n"; print " ", join ', ', do {my $famName = $_; map {"$_ $famName"} sort @{$families{$_}};}, "\n" for sort keys %families; __DATA__ Flintstone=Barney, Fred, Wilma Jetson=Max, Tony, Wilma Simpson=Lisa, Barney, Wilma, Homer Alcatraz=Elijah, Max, Wilma #### Num Families: 4 Num People: 13 All given Names: Barney Elijah Fred Homer Lisa Max Tony Wilma All family names: Alcatraz Flintstone Jetson Simpson All names grouped by family: Elijah Alcatraz, Max Alcatraz, Wilma Alcatraz, Barney Flintstone, Fred Flintstone, Wilma Flintstone, Max Jetson, Tony Jetson, Wilma Jetson, Barney Simpson, Homer Simpson, Lisa Simpson, Wilma Simpson,