The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl
#
# sort of like GNU grep
#

use strict;
use warnings;

use File::Slurp;
use Search::Tools;

my $usage = "$0 'query' file(s) \n";

my $query = shift @ARGV or die $usage;
my @files = @ARGV       or die $usage;

my $snipper = Search::Tools->snipper(
    query               => $query,
    collapse_whitespace => 1,
    type                => 'loop',
    occur               => 4,
    context             => 12
);

my $hiliter = Search::Tools->hiliter( query => $snipper->query, tty => 1 );

for my $f (@files) {
    my $text = read_file($f);
    my $snip = $snipper->snip($text);
    if ( !$snip ) {
        next;
    }
    print "$f: " . $hiliter->light($snip), $/;
}