Open p5pRT opened 20 years ago
perl -wle '$a=@F[4\,7]-=@F=3' Segmentation fault (core dumped)
perl-5.8.0@ton.iguana.be (via RT) wrote:
perl -wle '$a=@F[4\,7]-=@F=3' Segmentation fault (core dumped)
Could someone explain why this is allowed at all ? Why can I apply -= to an array slice but not to an array ?
$ ./perl -wle '@x=(1..5);@x[1\,2]-=3;print for@x' 1 2 0 4 5
$ ./perl -wle '@x=(1..5);@x-=3;print for@x' Can't modify array dereference in subtraction (-) at -e line 1\, near "3;" Execution of -e aborted due to compilation errors.
Going to answer my own question :
Could someone explain why this is allowed at all ? Why can I apply -= to an array slice but not to an array ?
Hm\, probably for compatibility with the (mistaken) use of a one-element slice as an array element.
@x[2] -= 3;
On Wed\, Oct 29\, 2003 at 09:58:02AM +0100\, Rafael Garcia-Suarez wrote:
Going to answer my own question :
Could someone explain why this is allowed at all ? Why can I apply -= to an array slice but not to an array ?
Hm\, probably for compatibility with the (mistaken) use of a one-element slice as an array element.
@​x\[2\] \-= 3;
Surely its just the normal 'last element returned' behaviour of a list in scalar context\, eg
$ perl5.8.1 -le'$a=1;$b=2;($a\,$b)+=10; print "$a $b"' 1 12 $ perl5.8.1 -le'$a=1;$b=2;@c=(($a\,$b)+=10); print "$a $b; @c"' 1 12; 12
-- You live and learn (although usually you just live).
Could someone explain why this is allowed at all ? Why can I apply -= to an array slice but not to an array ?
Hm\, probably for compatibility with the (mistaken) use of a one-element slice as an array element.
@x[2] -= 3;
Surely its just the normal 'last element returned' behaviour of a list in scalar context\, eg
Its not 'returned'\, its 'propagated'. It seems a list will return an alias to the last element. It further seems the element is not REFCOUNT++ed (same as with @_) and that this alias is retrieved before the right hand side of the expression is evaluated.
So it's clear:
1.) find LVALUE fro left hand side 1.1) evaluate array slice 1.2) create $F[0] to $F[7] on first access 1.3) return alias to $F[7] from list 2.) evaluate RVALUE from right hand side 2.1) fill array with new value 3 2.2.1) set $F[0] to 3 2.2.2) DESTROY $F[1] to $F[$#F] 3.) assign 3 via alias to destroyed SV 3.1) coredump
Michael Jacob
According to Michael.Jacob@SCHERING.DE:
It seems a list will return an alias to the last element. It further seems the element is not REFCOUNT++ed (same as with @_) and that this alias is retrieved before the right hand side of the expression is evaluated.
"Bob"dammit! Not another stack refcount bug!
Sorry about that. It's just fricking irritating that the stack still doesn't refcount its contents. -- Chip Salzenberg - a.k.a. - \chip@​pobox\.com "I wanted to play hopscotch with the impenetrable mystery of existence\, but he stepped in a wormhole and had to go in early." // MST3K
[chip - Wed Oct 29 13:54:58 2003]:
According to Michael.Jacob@SCHERING.DE:
It seems a list will return an alias to the last element. It further seems the element is not REFCOUNT++ed (same as with @_) and that this alias is retrieved before the right hand side of the expression is evaluated.
"Bob"dammit! Not another stack refcount bug!
Sorry about that. It's just fricking irritating that the stack still doesn't refcount its contents.
Well\, recent changes have caught the coredump. Now\, bleadperl is just panicking instead.
./perl -wle '$a=@F[4\,7]-=@F=3' Name "main::a" used only once: possible typo at -e line 1. panic: sv_upgrade to unknown type 255 at -e line 1.
Migrated from rt.perl.org#24342 (status was 'open')
Searchable as RT24342$