On Wednesday, September 10, 2003, Phil Carmody wrote:
> Do any of you gurus have anything to say about the regexp shootout at:
> http://www.bagley.org/~doug/shootout/bench/regexmatch/
> including the perl contender:
> http://www.bagley.org/~doug/shootout/bench/regexmatch/regexmatch.perl
> ?
The following code is about 2.8 times faster for big $NUM on
my machine. Avoiding the alternation by using a look-behind
and the shorter loop without inner blocks each contribute about
the same speedup.
- Karsten
use strict;
my $re = qr{
(?<![\d(]) # not preceded by digit or (
( \( )? # match 1: possible initial left paren
(\d\d\d) # match 2: area code is 3 digits
(?(1) \) ) # if match1 then match right paren
[ ] # area code followed by one space
(\d\d\d) # match 3: prefix of 3 digits
[ -] # separator is either space or dash
(\d\d\d\d) # match 4: last 4 digits
\D # must be followed by a non-digit
}x;
my $NUM = 0 + shift;
$NUM = 1 if $NUM < 1;
my @phones = <STDIN>;
my $count;
while ($NUM--) {
for (@phones) {
print ++$count, ": ($2) $3-$4\n" if /$re/o and $NUM == 0;
}
}