Beefy Boxes and Bandwidth Generously Provided by pair Networks
Welcome to the Monastery
 
PerlMonks  

Re^3: Can we make $& better? (need)

by demerphq (Chancellor)
on Sep 12, 2007 at 18:22 UTC ( [id://638639]=note: print w/replies, xml ) Need Help??


in reply to Re^2: Can we make $& better? (need)
in thread Can we make $& better?

The solution to the copy problem is to use m//g in scalar context which will NOT copy the string, and WILL result in the special match vars returning incorrect results if the string is changed after the fact.

And yes, we did discuss some other options to control this behaviour, its just i never got around to dealing with them and now its too late for 5.10. Sorry about that.

BTW, due to a misconception on my part I was extremely reluctant to add new modifiers. Im now much less reluctant as I resolved the misconception. The misconception was that adding new modifiers would break loads and loads of stuff, but further analysis proved that this was an unfounded concern.

---
$world=~s/war/peace/g

Replies are listed 'Best First'.
Re^4: Can we make $& better? (need)
by tye (Sage) on Sep 12, 2007 at 19:12 UTC

    Wow. There needs to be a cheat sheet for this because every time it comes up I find mistakes, in this case my own. So my previous discovery that capturing parens cause the entire string to be copied is mostly not true. I assume the copy is required for s/// and s///g. Testing shows that otherwise the copy only happens for m// on modern perls (the 'scalar context' part doesn't appear to matter in my current testing) and doesn't even happen then with 5.6.

    It is nice that I can stop fearing the performance impact of capturing parens when doing the usual scalar-context m/.../gc of a parser. Thanks!

    - tye        

      Hrm, ill have to check the code in more detail, however I'm pretty sure that /g in list context copies the string *once*, wheras /g in scalar context doesn't copy it at all. The latter I know because i "fixed" it in 5.9.5 and then had to back out the fix because it caused an unacceptable slowdown.

      However as far as I know you were correct, using capturing parens will cause a copy of the full string. Ill try to follow up with more details from the code when I have more time.

      ---
      $world=~s/war/peace/g

        BTW, my test was to change the string used in the match and then see if $1 also changed. That isn't a perfect test because it might be that the string is copied but $1 doesn't correctly use the copy made, for example. Here is a more polished version and two sets of results:

        #!/usr/bin/perl -w use strict; print "$] $^O\n"; for( qw( s l sg lg ) ) { my $x= "-y1-y2-"; my @y; $y[0]= $x =~ /(.\d)/ if 's' eq $_; @y= $x =~ /(.\d)/ if 'l' eq $_; $y[0]= $x =~ /(.\d)/g if 'sg' eq $_; @y= $x =~ /(.\d)/g if 'lg' eq $_; $x= ":1n:2n:"; print "$_ ($1)\n"; } __END__ 5.006 MSWin32 s (y1) l (1n) sg (1n) lg (2n) 5.008008 MSWin32 s (y1) l (y1) sg (1n) lg (2n)

        Which shows I'd missed the only "will copy" case in 5.6.

        - tye        

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://638639]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others scrutinizing the Monastery: (5)
As of 2024-03-28 20:43 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found