#!/usr/bin/env perl5.16.0 use 5.16.0; use warnings; use Benchmark qw/cmpthese/; use List::MoreUtils qw/any/; my @array = (0..10_000, 'abcd'); my %hash = map { $_ => 1 } @array; my @tests = ( [ 'a' ], [ 'ab' ], [ 'abc' ], [ 0, 1 ], [ 1, 1 ], [ 10, 1 ], [ 100, 1 ], [ 1000, 1 ], [ 10000, 1 ], [ 'abcd', 1 ], ); sub run_tests { my $funcname = shift; my $func = __PACKAGE__->can($funcname); my $warnings; local $SIG{__WARN__} = sub { $warnings++ }; for my $t (@tests) { $warnings = 0; my $rc = $func->($t->[0]); die "Invalid return ($funcname, $t->[0])\n" unless !$t->[1] == !$rc; warn "Had warnings ($funcname, $t->[0])\n" if $warnings; } } sub grep_in_array { my $element = shift; grep { $element eq $_ } @array and return 1; return; } sub brx_match { my $element = shift; $element eq $_ && return 1 for @array; return; } sub smartish_match { my $element = shift; given("_$element") { when ([map "_$_", @array]) { 1 } default { 0 } } } sub smartish_match_2 { my $element = shift; given ($element) { when ([map "$_", @array]) { 1 } default { 0 } } } sub smarthash { my $element = shift; given ($element) { when (\%hash) { 1 } default { 0 } } } sub smarthash_slow { my $element = shift; my %hash = map { $_ => 1 } @array; given ($element) { when (\%hash) { 1 } default { 0 } } } sub any_match { my $element = shift; any { $element eq $_ } @array; } cmpthese -1, { grep => sub { run_tests 'grep_in_array' }, brx => sub { run_tests 'brx_match' }, sm1 => sub { run_tests 'smartish_match' }, sm2 => sub { run_tests 'smartish_match_2' }, sh1 => sub { run_tests 'smarthash' }, sh2 => sub { run_tests 'smarthash_slow' }, any => sub { run_tests 'any_match' }, };