use strict; use warnings; my %search; open( LIST, "cdr_details.1" ) or die "cdr_details.1: $!"; while () { chomp; my @terms = (split /,/, $_, -1 )[0,1,2,6,7]; my $xdrfile = pop @terms; # file to search is last term push @{$search{$xdrfile}}, join( "\0", @terms ); # save remaining terms as a null-byte-separated string # multiple strings are pushed into an array for each xdr file } close LIST; open( OUT, ">cdr_tdm.csv" ) or die "cdr_tdm.csv: $!"; for my $xdrfile ( sort keys %search ) { my @findsets = @{$search{$xdrfile}}; open( XDR, $xdrfile ) or do { warn "$xdrfile: $!\n"; next }; while () { chomp; my $fldset = join( "\0", (split /,/, $_, -1 )[1,2,4,6] ); # $fldset is a null-byte-separated string that could match findsets for my $findset ( @findsets ) { if ( $fldset eq $findset ) { print OUT; last; } } } close XDR; }