use strict; use warnings; my %pairs; while () { chomp; next if ! length; my @pair = sort split; ++$pairs{$pair[0]}{$pair[1]}; } my $totalHits = 0; my %seconds; for my $first (sort keys %pairs) { for my $second (sort keys %{$pairs{$first}}) { next if $pairs{$first}{$second} <= 1; ++$totalHits; my $previous = grep {exists $pairs{$_}{$first} && exists $pairs{$_}{$second}} keys %{$seconds{$first}}; ++$seconds{$second}{$first}; next if $previous; print "$first $second\n"; } } print "$totalHits\n"; __DATA__ NP_01 NP_02 NP_02 NP_01 NP_01 NP_03 NP_03 NP_01 NP_02 NP_03 NP_03 NP_02 NP_04 NP_05