use strict; use warnings; die "No search terms supplied!" unless @ARGV; my %targets; my ($prePost) = $ARGV[0] =~ /^(\d+)$/; my @words = split /(?= )/, do {local $/ = undef; }; my @tags; shift if defined $prePost; $prePost = 5 unless defined $prePost; map {$targets{$_} = (0)} @ARGV; for (0..$#words) { $words[$_] =~ s/[\r\n]+/ /; my $curr = $words[$_]; my ($pre, $word, $post) = $curr =~ /([^\w]*)(\w*)(.*)/; if (exists $targets{$word}) { $words[$_] = "$pre<$word>$post"; push @tags, $_; } next if ! @tags or $tags[0] > $_ - $prePost; print "".(join '', @words[$tags[0] - $prePost .. $tags[-1] + $prePost])."\n"; @tags = (); } print join '', @words[$tags[0] - $prePost .. $#words] if @tags;