use strict; use warnings; my ($filename, @mainword, $distance, @search) = @ARGV; my $content; open my $fh, '<', $filename or die $!; local $/ = undef; $content = <$fh>; close $fh; my @docs = split 'Document ', $content; foreach my $doc ( @docs ) { my $count = 0; my $mainword = '(' . (join '|', map { "\Q$_\E" } @mainword) . ')'; my $search = '(' . (join '|', map { "\Q$_\E" } @search) . ')'; for (my $dist = 0; $dist <= $distance; $dist++) { while ( $doc =~ / (?:^|\W) $search (?= (?:\W++\w++){$dist} \W++\Q$mainword\E ) /ixsg ) { print " found [$1] at ", $-[1], "\n"; $count++; } while ( $doc =~ / (?:^|\W) \Q$mainword\E (?= (?:\W++\w++){$dist} \W++$search ) /ixsg ) { print "-found [$1] at ", $-[1], "\n"; $count++; } } print "match: $count\n"; }