my %lookingFor; # keys => different name of one subset # values => array of one subset my $fh = new FileHandle "< largeLogFile.log"; while (<$fh>) { foreach my $subset (keys %lookingFor) { foreach my $item (@{$subset}) { if (<$fh> =~ m/$item/) { my $writeFh = new FileHandle ">> myout.log"; print $writeFh <$fh>; } } } #### $isSubSet=buildRegexp(@allSubSets); while (<$fh>) { foreach my $subset (keys %lookingFor) { if (&$isSubSet(<$fh>)) { my $writeFh = new FileHandle ">> myout.log"; print $writeFh <$fh>; } } } sub buildRegexp { my @R = @_; my $expr = join '||', map { "\$_[0] =~ m/\(To\|is\)\\:\\S\+\\@\$R[$_]/io" } ( 0..$#R ); my $matchsub = eval "sub { $expr }"; if ($@) { $logger->error("Failed in building regex @R: $@"); return ERROR; } $matchsub; }