my @lines = ("AB","ACFI","ADGJ","AE","BCDE","BFHJ","BI","EGHI","EJ","IJ"); foreach my $i ("A".."H") { foreach my $j (++(my $ii = $i) .. "I") { foreach my $k (++(my $jj = $j) .. "J") { print "$i$j$k\n" if 3 == grep {/$i.*$j|$i.*$k|$j.*$k/} @lines; } } }