#! perl -slw use strict; use Data::Dump qw[ pp ]; use Algorithm::Combinatorics qw[ combinations ]; my @lines = map [ do{ chomp; split ',' } ], ; my $w = $#{ $lines[0] }; my @keyFields; WIDTH: for my $k ( 1 .. $w ) { my $iter = combinations( [ 0 .. $w ], $k ); COMB: while( my $c = $iter->next ) { my %uniq; for my $a ( @lines ) { next COMB if exists $uniq{ join ',', @{ $a }[ @$c ] }; $uniq{ join ',', @{ $a }[ @$c ] } = 1; } @keyFields = @$c; last WIDTH; } } print "All lines are unique using a combination of fields:[ @keyFields ]"; __DATA__ 2,6,5,2,1,1,7,9,8,6 5,8,5,0,9,3,8,9,0,2 2,3,1,1,5,2,9,7,8,3 0,1,3,7,6,2,4,3,7,5 4,6,2,8,6,4,1,5,4,3 4,6,7,2,0,9,6,5,0,9 5,6,2,4,3,7,1,9,3,5 2,5,7,1,0,0,0,5,8,5 3,8,1,4,9,2,5,8,1,0 5,2,2,2,0,7,2,8,3,1 7,1,2,6,5,4,0,9,2,5 1,6,3,7,3,8,7,0,7,7 0,0,8,9,9,8,3,3,6,0 0,2,5,3,8,4,1,8,9,4 5,6,9,0,6,4,9,5,0,7 9,0,9,3,2,6,3,2,4,6 3,3,0,4,8,5,7,7,2,4 3,1,3,0,0,3,1,7,3,8 0,6,7,0,8,9,4,8,4,8 0,2,0,3,7,4,6,8,4,5