## cat p.pl ; perl p.pl # This is "grep -f" like. use v5.10.0; use strict; my @in = ( "polka\n" , "avoid redding dot me\n" , "dot me\n" , "yellow\n" ); my $find = 'me'; my $avoid = 'avoid'; for my $ignore ( $avoid , undef ) { process_input( $find , $ignore , @in ); print "- - - -\n"; } exit; sub process_input { my ( $grep , $skip , @in ) = @_; my $show; while ( my $line = shift @in ) { $show = find( $grep , $line ) && ( defined $skip ? ! find ( $skip , $line ) : 1 ) ; } continue { $show and print $line; } return; } sub find { my ( $find , $line ) = @_; defined $find && defined $line or return; my @break = split '' , $find; my $size = scalar @break; my $start = 0; my ( @seen ); for my $c ( @break ) { my $i = index $line , $c , $start; $i == -1 || scalar @seen == $size and last; push @seen , $i; if ( scalar @seen > 1 ) { $seen[-1] - $seen[-2] == 1 or last; } $start = $i + 1; } return scalar @seen == $size } __END__ dot me - - - - avoid redding dot me dot me - - - -