in reply to Re^2: Regex: find all trailing numerical digits in a string
in thread Regex: find all trailing numerical digits in a string

It would seem to me that $& would be more readable than substr( $str, $-[0], $+[0] - $-[0] ).

use strict; while(<DATA>) { chomp; /\d+$/; print "Numeric: [$&]\n"; } __DATA__ asdf_sadf-3i897sdyf33987 3w45t-wevt453_838475693

Is there a case where you would use the substr over $&?


"Look, Shiny Things!" is not a better business strategy than compatibility and reuse.


OSUnderdog

Replies are listed 'Best First'.
Re^4: Regex: find all trailing numerical digits in a string
by dragonchild (Archbishop) on Dec 06, 2004 at 19:53 UTC
    $& slows down every regex in the entire application. Generally, you shouldn't use it unless you literally have no other way of doing things.

    Being right, does not endow the right to be rude; politeness costs nothing.
    Being unknowing, is not the same as being stupid.
    Expressing a contrary opinion, whether to the individual or the group, is more often a sign of deeper thought than of cantankerous belligerence.
    Do not mistake your goals as the only goals; your opinion as the only opinion; your confidence as correctness. Saying you know better is not the same as explaining you know better.

      There is a penalty for $&, but it's not as bad as it used to be in olden times. Running some benchmarks (the $& one in a separate perl to avoid tainting the non-$& results):

      $ perl -MBenchmark=cmpthese -le 'my $a; $_ = "abcdefghi"; cmpthese( 2_ +000_000, { "01 \$&" => sub { /def/; $a = $& } } )' Rate 01 $& 01 $& 1025641/s -- $ perl -MBenchmark=cmpthese -le 'my $a; $_ = "abcdefghi"; cmpthese( 2_ +000_000, { "02 substr" => sub { /def/; $a = substr( $_, $-[0], $+[0] +- $-[0] ) }, "03 paren" => sub { /(def)/; $a = $1 } } )' Rate 02 substr 03 paren 02 substr 116822/s -- -89% 03 paren 1098901/s 841% --

      So using $& is only about 4-7% slower than capturing parens (I did several runs of these and this is one of the slow results sets), and both of them are about ten times as fast as the substr() incantation (presumably since $&/$1 are happening all in C under the hood rather than going back and forth a bit as it does).

      So yeah be aware there's a hit, but don't let it scare you away from $& completely.