in reply to two regexes in one function call

It looks like second regex result is overwriting also the first result.

Indeed.

$data = do { local $/ = undef; <DATA> }; print \$_, "\n" for scalar($data =~ s/\n/\n/g), scalar($data =~ s/(\w+)/\1/g); __DATA__ Line1 Word Something Line2 Other Word
SCALAR(0x239224) \ Same var! SCALAR(0x239224) /

In ActivePerl 5.10.0 build 1004, s/// appears to place the return value in a global variable, and it appear to place that global variable (not a copy) on the stack.

By the way, it's wrong to use \1 in the replacement expression. Use $1.

Replies are listed 'Best First'.
Re^2: two regexes in one function call
by BrowserUk (Patriarch) on Jul 28, 2009 at 16:43 UTC

    I'm not sure that's the complete explaination as you get different results if you reverse the order of the statements:

    #! perl -sw use 5.010; $data = do { local $/ = undef; <DATA> }; my $x = [ scalar($data =~ s/(\w+)/$1/g), scalar($data =~ s/\n/\n/g), ]; say "@$x"; my $y = [ scalar($data =~ s/\n/\n/g), scalar($data =~ s/(\w+)/$1/g), ]; say "@$y"; __DATA__ Line1 Word Something Line2 Other Word

    Gives:

    c:\test>783947.pl 6 2 6 6

    (Plus tr isn't a regex!)


    Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
    "Science is about questioning the status quo. Questioning authority".
    In the absence of evidence, opinion is indistinguishable from prejudice.
      Minor change:
      #! perl -sw use 5.010; $data = do { local $/ = undef; <DATA> }; my $x = [map \$_, scalar($data =~ s/(\w+)/$1/g), scalar($data =~ s/\n/\n/g), ]; say "@$x"; my $y = [map \$_, scalar($data =~ s/\n/\n/g), scalar($data =~ s/(\w+)/$1/g), ]; say "@$y"; __DATA__ Line1 Word Something Line2 Other Word
      SCALAR(0x2392c4) SCALAR(0x239224) SCALAR(0x239314) SCALAR(0x239314)

      The Ys use the same variable for the return value, but not the Xs.

      I don't actually know *why* the two calls return the same variable.

      Interestingly, the problem goes away if the captures are removed.

      Update: There has been a change in the relevant code since 5.10.0, but it appears to be an optimisation and not a fix.

      5.10.0:
      PUSHs(sv_2mortal(newSViv((I32)iters)));

      maint-5.10 as it stands right now:
      mPUSHi((I32)iters);

      Patch

      In both case, it looks like the operator always returns a new SV, so maybe there's some stack corruption??