#! perl -slw use strict; use List::Util qw[ max ]; our $BUFSIZE ||= 2**20; my @needles = qw[ 2228809700 123456 234567 345678 456789 1234567890 ]; my $regex = '(?:' . join( '|', map quotemeta, @needles ) . ')'; my $maxLen = max map length, @needles; open FILE, '<', $ARGV[ 0 ] or die "$ARGV[ 0 ]: $!"; my( $soFar, $offset ) = ( 0, 0 ); while( my $read = sysread FILE, $_, $BUFSIZE, $offset ) { while( m[$regex]g ) { printf "(%d): '%s'\n", pos() + $soFar, substr $_, $-[0], $+[0]-$-[0]; } substr $_, 0, $maxLen, substr $_, -$maxLen; $soFar += $read; $offset = $maxLen; }