my %players; for () { chomp; my ($team) = m!^ (.+?) = (?.+?) \s*/\s* (?.+) $!x or die "Line `$_' doesn't match"; for my $side (qw) { $players{$_}{$side} = $team for split m!\s*[,/]\s*!, $+{$side}; } } # Remove players only on one team delete @players{ grep { keys %{$players{$_}} == 1 } keys %players }; local $" = ' AND '; print "$_ IS IN @{$players{$_}}{qw}\n" for keys %players; #### my %players; for () { chomp; my ($team,$players) = split /=/; push @{$players{$_}}, $team for split m!\s*[,/]\s*!, $players; } delete @players{ grep { @{$players{$_}} == 1 } keys %players }; local $" = ' AND '; print "$_ IS IN @{$players{$_}}\n" for keys %players;