First, split takes a regular expression, not a string (except sometimes ;-). So splitting on '\t' won't give the expected results. Next, I suspect that @id_list grows fairly long over time, and you are iterating over the entire array with grep. A hash is more suitable here:
use strict; use warnings; my $name = ''; my %id_list; open (STDIN,"perl first_program.pl|") || die "$!"; open (OUT, ">", "out.txt") || die "$!"; while(my $line_in =<STDIN>){ chomp($line_in); my @line_array = split(/\t/,$line_in); my @subline_array = split(/\|/, $line_array[1]); unless ($name eq $line_array[0]) { %id_list = (); $name = $line_array[0]; } next if $id_list{$subline_array[3]}++; print OUT "$line_in\n"; }
If you experience memory shortage, tie the hash %id_list to a disk file via e.g. DB_File.
In reply to Re: slow parser how to make it faster
by shmem
in thread slow parser how to make it faster
by baxy77bax
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |