use strict; use warnings; use Tie::File; my %seen; tie my @file, 'Tie::File', 'data.txt' or die $!; @file = grep { !$seen{substr($_,index($_,'|'))}++ } @file;