use strict; use warnings; use feature 'say'; use List::Util 'any'; use Benchmark 'cmpthese'; my $data = ''; for my $r ( 0 .. 31 ) { for my $c ( 0 .. 31 ) { $data .= "$c $r whatever\n" } } # say $data; die; my @skip = ( 0, 15, 16, 31 ); cmpthese -1, { ugly => sub { while ( $data =~ /^(\d+) (\d+)/mg ) { next if $1 == 0 or $1 == 15 or $1 == 16 or $1 == 31; next if $2 == 0 or $2 == 15 or $2 == 16 or $2 == 31; # something useful happens here, # after uninteresting entries have been skipped } return 1 }, ugly_cr => sub { while ( $data =~ /^(\d+) (\d+)/mg ) { my ( $c, $r ) = ( $1, $2 ); next if $c == 0 or $c == 15 or $c == 16 or $c == 31; next if $r == 0 or $r == 15 or $r == 16 or $r == 31; } return 1 }, any => sub { while ( $data =~ /^(\d+) (\d+)/mg ) { next if any { $1 == $_ } @skip; next if any { $2 == $_ } @skip; } return 1 }, any_cr => sub { while ( $data =~ /^(\d+) (\d+)/mg ) { my ( $c, $r ) = ( $1, $2 ); next if any { $c == $_ } @skip; next if any { $r == $_ } @skip; } return 1 } }; #### Rate any_cr any ugly ugly_cr any_cr 331/s -- -54% -64% -74% any 724/s 119% -- -22% -43% ugly 930/s 181% 28% -- -26% ugly_cr 1265/s 282% 75% 36% --