http://qs321.pair.com?node_id=638654


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

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

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

    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