use Tie::File; ... tie my @ptt_records, q{Tie::File}, $ptt_file or die $!; foreach my $k1 (keys %empty_geneids){ @ptt_records = grep { ! /$k1/ } @ptt_records; } untie @ptt_records;