c:\@Work\Perl>perl -wMstrict -MData::Dump -le "my $data = [ [ 123 ], [ 789 ], [ 'dup' ], [ 456 ], [ 123 ], [ 'dup' ], [ 543 ], ]; dd $data; ;; $data = do { my %seen; [ grep { not $seen{ $_->[0] }++ } @$data ]; }; dd $data; " [[123], [789], ["dup"], [456], [123], ["dup"], [543]] [[123], [789], ["dup"], [456], [543]] #### c:\@Work\Perl>perl -wMstrict -MData::Dump -le "my $data = [ [ 123 ], [ 789 ], [ 'dup' ], [ 456 ], [ 'dup' ], [ 123 ], [ 543 ], ]; dd $data; ;; my %seen; my $lo = 0; for (my $hi = 0; $hi <= $#$data; ) { ++$seen{ $data->[$lo][0] = $data->[$hi][0] }; ++$lo; ++$hi while $hi <= $#$data && $seen{ $data->[$hi][0] }; } $#$data = $lo-1; dd $data; " [[123], [789], ["dup"], [456], ["dup"], [123], [543]] [[123], [789], ["dup"], [456], [543]]