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;
    }
}

Reply via email to