in reply to Shell Script Woes
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 $/.
|
---|
Replies are listed 'Best First'. | |
---|---|
Re: Re: Shell Script Woes (tye's try)
by Limbic~Region (Chancellor) on Jan 09, 2003 at 20:14 UTC | |
by tye (Sage) on Jan 09, 2003 at 21:30 UTC | |
by Limbic~Region (Chancellor) on Jan 10, 2003 at 23:14 UTC |