You need to quotemeta since you are trying to match a list of fixed strings not a list of regular expressions. This also makes it easy to figure out the maximum length of "carry over" you need between buffers.
Tested and works. Note that this assumes that you don't have huge runs of newlines in the middles of your matches. - tye#!/usr/bin/perl -w use strict; my @checklist; my @testfile; my $rulenames; open( FILE, "wordlist" ) or die "Can't read wordlist: $!\n"; my $maxLen = 0; while( <FILE> ) { next if $_ =~ /^ *$/ || $_ =~ /^#/; $maxLen = length($_) if $maxLen < length($_); push @checklist, $_; } chomp @checklist; close(FILE); my $bufSize= 8*1024; $bufSize= 2*$maxLen if $bufSize < 2*$maxLen; my $GrepList = join '|', map quotemeta $_, @checklist; $GrepList = qr/($GrepList)/i; @ARGV = grep -f $_, <*>; $/= \$bufSize; # Have <> read $bufSize bytes if( @ARGV ) { my $prev= ""; while( <> ) { $_ =~ s/\n//g; if( ($prev.$_) =~ /$GrepList/ ) { print "$ARGV : $1\n"; close( ARGV ); $prev= ""; } elsif( eof ) { $prev= ""; } else { $prev = substr( $_, -$maxLen ); } } }
Updated: I originally left out the setting of $/.
In reply to Re: Shell Script Woes (tye's try)
by tye
in thread Shell Script Woes
by Limbic~Region
For: | Use: | ||
& | & | ||
< | < | ||
> | > | ||
[ | [ | ||
] | ] |