Stone [S], on Thursday, March 10, 2005 at 16:46 (-0800) typed:

S> That won't work either.  When you say ([1-9]\d?) you're telling it
S> "(If there is a match) capture the stuff in parentheses and store it."
S>  When you say "\1" you're telling the script "you know that first
S> batch of stuff you captured?  Well I want that here."  But it's not
S> the pattern, it's the literal substring of the match.

When I read your first line of reply, I realise, that you have right
again. Tomorrow was hard day for me, and also after some glassess of
wine I simply forget to some small details. And also I have to thank
you for nice and long explanation :) Ok, so I'm sorry, if I
confused someone, here is my explanation:

I don't like "simple" regular expressions, as was posted in first
message:

$field =~ /^[1-9]\d?\.[1-9]\d?\.[1-9]\d?$/;

that's too clear. I wanted change it (short), so I post 2 bad
examples. Clear shorting is:

$field =~ /^([1-9]\d?\.){2}[1-9]\d?$/;

but that's too much simple too :)

So let's continue how we can represent those rulez, this is a bit
tricky:

$field =~ /^([1-9]\d(?:\.[1-9]\d){2})$/;

and this is not shorter, but this way works too :):

$field =~ /^(?:(\d)(??{ $1 > 0 && $1 <= 9 ? "" : "(?!)" })\d\.){2}
               (\d)(??{ $2 > 0 && $2 <= 9 ? "" : "(?!)" })\d/x;

Ok, that's enough, now we can benchmark all those:

use strict;
use warnings;
use Benchmark 'cmpthese';

my $field = '19.12.12';

cmpthese -5, {
        simple => sub {
                if ( $field =~ /^[1-9]\d?\.[1-9]\d?\.[1-9]\d?$/ ) {}
        },
        short => sub {
                if ( $field =~ /^([1-9]\d\.){2}[1-9]\d$/ ) {}
        },
        shortwoc => sub {
                if ( $field =~ /^(?:[1-9]\d\.){2}[1-9]\d$/ ) {}
        },
        tricky => sub {
                if ( $field =~ /^([1-9]\d(?:\.[1-9]\d){2})$/ ) {}
        },
        trickywoc => sub {
                if ( $field =~ /^(?:[1-9]\d(?:\.[1-9]\d){2})$/ ) {}
        },
        long => sub {
                if  ( $field =~ /^(?:(\d)(??{ $1 > 0 && $1 <= 9 ? "" : "(?!)" 
})\d\.){2}
                                     (\d)(??{ $2 > 0 && $2 <= 9 ? "" : "(?!)" 
})\d/x ) {}
        },
        using_var => sub {
                my $reg = '[1-9]\d';
                if ( $field =~ /^(?:$reg\.){2}$reg$/ ) {}
        }
};

__END__

               Rate    long using_var   short  tricky  simple shortwoc trickywoc
long        30584/s      --      -95%    -95%    -95%    -98%     -98%      -98%
using_var  582064/s   1803%        --    -11%    -14%    -56%     -60%      -62%
short      650382/s   2027%       12%      --     -3%    -51%     -56%      -58%
tricky     673134/s   2101%       16%      3%      --    -49%     -54%      -57%
simple    1328337/s   4243%      128%    104%     97%      --     -10%      -14%
shortwoc  1470620/s   4708%      153%    126%    118%     11%       --       -5%
trickywoc 1550263/s   4969%      166%    138%    130%     17%       5%        --

second benchmark:
my $field = '19.12.02';

               Rate    long using_var shortwoc   short  simple  tricky trickywoc
long        28809/s      --      -95%     -98%    -98%    -98%    -98%      -98%
using_var  606756/s   2006%        --     -63%    -63%    -64%    -64%      -66%
shortwoc  1627591/s   5550%      168%       --     -1%     -3%     -5%       -9%
short     1651154/s   5631%      172%       1%      --     -2%     -3%       -8%
simple    1681601/s   5737%      177%       3%      2%      --     -2%       -6%
tricky    1707274/s   5826%      181%       5%      3%      2%      --       -5%
trickywoc 1790738/s   6116%      195%      10%      8%      6%      5%        --

so conlusion is: I definitely would pick up
tricky WithOut Capturing: $field =~ /^(?:[1-9]\d(?:\.[1-9]\d){2})$/

I hope I don't have any bugs here :)

Have a nice day.

-- 

 ...m8s, cu l8r, Brano.

["Real knowledge is to know the extent of one's ignorance." - Confucius]



-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>


Reply via email to