while (<$file_handle>) { my @line_array = split(/,/,$_); push(@filtered_result,$_) if $line_array[70] =~ /192\.168\.200\.|10\.10\.200/; #THIS ISN'T EXACTLY WHAT I WAS DOING SINCE I USUALLY HAD MULTIPLE VALUES TO CHECK } #### my $grep_filters = [ { 'sub' => sub { my ($line) = shift @_; return $line if $line =~ /,SEVERE,/; }, }, { 'sub' => sub { my ($line) = shift @_; return $line if $line =~ /192\.168\.200\.|10\.10\.200/; return undef; }, }, ]; while(<$FILE>){ foreach my $my_filter_fn (@$filters){ my $return = $my_filter_fn->{'sub'}->($_); push(@return_array,$return) unless not defined $return; } } #### my @filter_string_array = ('192\.168\.200\.|10\.10\.200',',SEVERE,'); ... my @local_filter_string_array = @filter_string_array; my $first_filter_string = shift @local_filter_string_array; my @output = grep {/$first_filter_string/} <$FILE>; foreach my $filter_string (@local_filter_string_array){ @output = grep {/$filter_string/} @output; } #### my $grep_source = '<$FILE>'; my @filter_string_array = ('192\.168\.200\.|10\.10\.200',',SEVERE,'); foreach my $filter_string (@filter_string_array){ $grep_string_expansion = 'grep {/' . $filter_string . '/} (' . $grep_source . ')'; $grep_source = $grep_string_expansion; } #string should look like this: grep {/,SEVERE,/} (grep {/192\.168\.200\.|10\.10\.200/} (<$FILE>)); ... my @output = eval $grep_string_expansion; #### grep {/,SEVERE,/} (grep {/192\.168\.200\.|10\.10\.200/} (<$FILE>));