Beefy Boxes and Bandwidth Generously Provided by pair Networks
P is for Practical

The /p modifier in Perl5.10 regexps

by casiano (Pilgrim)
on Aug 30, 2009 at 11:18 UTC ( #792168=perlquestion: print w/replies, xml ) Need Help??

casiano has asked for the wisdom of the Perl Monks concerning the following question:

Dear Monks

The /p modifier introduced in 5.10 makes ${^PREMATCH}, {$^MATCH}, and ${^POSTMATCH} available for use after matching. It is assumed it is faster than using $`, $& and $'. But when I benchmark this code:

pl@nereida:~/src/perl/perltesting$ cat ./ #!/usr/local/lib/perl/5.10.1/bin//perl5.10.1 -w use strict; use Benchmark qw{:all}; cmpthese( 1000000, { p => q{'hola juan' =~ /ju/p; my ($a, $b, $c) = (${^PREMATCH}, ${^M +ATCH}, ${^POSTMATCH} ) }, oldway => q{'hola juan' =~ /ju/; my ($a, $b, $c) = ($`, $&, $') } } ); cmpthese( 10000000, { pnoassign => q{'hola juan' =~ /ju/p; }, oldwaynoassign => q{'hola juan' =~ /ju/; } } );
I've got:
pl@nereida:~/src/perl/perltesting$ ./ Rate p oldway p 892857/s -- -6% oldway 952381/s 7% -- Rate oldwaynoassign pnoassign oldwaynoassign 3184713/s -- -1% pnoassign 3225806/s 1% --
It seems that the old way is faster. Any explanations?


Replies are listed 'Best First'.
Re: The /p modifier in Perl5.10 regexps
by lodin (Hermit) on Aug 30, 2009 at 12:01 UTC

    The point is that $` with friends slow down every other pattern as well. If you use /p you will still have a comparatively slow match, but it won't effect the other matches.

    use 5.010; use strict; use warnings; use Benchmark qw(cmpthese timethese); my $r1 = timethese( -1, { p_before => sub { 'hola juan' =~ /ju/p }, no_p_before => sub { 'hola juan' =~ /ju/ }, }, 'none'); eval '$`'; my $r2 = timethese( -1, { p_after => sub { 'hola juan' =~ /ju/p }, no_p_after => sub { 'hola juan' =~ /ju/ }, }, 'none'); cmpthese({ %$r1, %$r2 }); __END__ Rate p_before no_p_after p_after no_p_before p_before 1067899/s -- -2% -2% -80% no_p_after 1084733/s 2% -- -1% -80% p_after 1091288/s 2% 1% -- -79% no_p_before 5318863/s 398% 390% 387% --
    As you see, the pattern with /p and the patterns executed after $` has been seen are equally fast, and that makes sense since they do the same work. The pattern without /p and before $` is however significantly faster, since it does not have to compute the extra match variables.

    Hope this helps,

Re: The /p modifier in Perl5.10 regexps
by casiano (Pilgrim) on Aug 30, 2009 at 11:26 UTC
    Sorry, let me clarify a bit the question

    I mean, the difference is not significant when no assignment is involved and there is a more significant difference when I store the results


Log In?

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: perlquestion [id://792168]
Approved by Perlbotics
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others drinking their drinks and smoking their pipes about the Monastery: (4)
As of 2022-05-27 16:00 GMT
Find Nodes?
    Voting Booth?
    Do you prefer to work remotely?

    Results (96 votes). Check out past polls.