use strict; use warnings; use Benchmark qw( cmpthese ); my $OUTER = $ARGV[0] || -1; my $INNER = $ARGV[1] || 1000; sub test { my ($name, $code, $expect) = @_; my $rc = eval($code)?1:0; my $ok = ($expect == $rc); printf("%-11s %-10s %-8s %s\n", our $arg, $name, $rc?'match':'no match', $ok?'ok':'XXX'); } my %tests = ( ikegami1 => '$arg =~ /^(?=.*[A-Za-z])(?=.*[0-9])[A-Za-z0-9]{3,10}\z/', ikegami2 => '$arg =~ /^[A-Za-z0-9]{3,10}\z/ && $arg =~ /[A-Za-z]/ && $arg =~ /[0-9]/', ikegami3 => '$arg =~ /^(?=[A-Za-z0-9]{3,10}\z).*(?:[0-9][A-Za-z]|[A-Za-z][0-9])/', ikegami4 => '$arg =~ /(?>(?:[0-9][A-Za-z]|[A-Za-z][0-9]).*\z)(?(?{pos($arg)<3||pos($arg)>10})(?!))/', ); for (values %tests) { $_ = "our \$arg; my \$rv = $_;"; } for ( [ 'a0', 0 ], [ 'a0a', 1 ], [ 'a0a0a0a0a0', 1 ], [ 'a0a0a0a0a0a', 0 ], [ 'aaaaa', 0 ], [ '00000', 0 ], ) { (local our $arg, my $expect) = @$_; for my $name (sort keys %tests) { test($name, $tests{$name}, $expect); } print("\n"); } print("\n"); my %bench_code = map { $_ => "use strict; use warnings; for (1..$INNER) { $tests{$_} }" } keys %tests; for ( [ 'Short', '2j' ], [ 'Fine', 'n4a1z9' ], [ 'Just Letters', 'nhfdmzaa' ], [ 'Long', 'qq3m3aaaazz3' ], ) { (my $name, local our $arg) = @$_; print("----------------------------------------\n"); print("$name (arg: $arg)\n\n"); cmpthese($OUTER, \%bench_code); print("\n"); print("Multiply by $INNER to get real rate\n"); print("\n"); }