Re: perl pad.c Assertion !((sv)->sv_flags & 0x00010000) failed



On Thu, 21 Jun 2007 22:33:03 +0100, Tim Bunce wrote:
On Thu, Jun 21, 2007 at 06:47:11PM +0200, Rafael Garcia-Suarez wrote:
On 21/06/07, Steve Hay <steve.hay@xxxxxxxxxxxx> wrote:
I remember lots of discussion a while ago about constructions like "my
$x = 1 if $y;". I don't remember what the conclusion of it all was,
except that it's probably best avoided. Is that right?

Yes, that's right, because that could bypass initialisation of $x if
$y is false, leaving the previous value in it, like in state vars.

I thought that issue only related to a "compile-time constant false"
(such as the one in your example) and not to a runtime expression that
happened to be false sometimes.

Looking at it another way, are you saying that (ignoring closures)
subroutine scoped lexicals are not cleared when the subroutine exits,
but persist (consuming memory) until the subroutine is reentered?

$ ./perl -wle '$q = shift; sub foo { my $x if $q; print $x // $]; \
$x = 42 } foo; $q++; foo' 0
5.009005
42

It looks like it, no?

--
Peter Scott

.



Relevant Pages

  • Re: perl pad.c Assertion !((sv)->sv_flags & 0x00010000) failed
    ... $y is false, leaving the previous value in it, like in state vars. ... subroutine scoped lexicals are not cleared when the subroutine exits, ... but persist (consuming memory) until the subroutine is reentered? ... but I seem to recall Dave explaining once in the past that perl trys ...
    (perl.dbi.users)
  • Re: Exiting os.spawnvs subroutine
    ... Strange but removing the try/except part of the second script (leaving ... only the processing) removed the 2 minute lag at the end of each ... subroutine. ...
    (comp.lang.python)
  • RE: perl pad.c Assertion !((sv)->sv_flags & 0x00010000) failed
    ... perl pad.c Assertion!->sv_flags & 0x00010000) failed ... Yes, that's right, because that could bypass initialisation of $x if ... I thought that issue only related to a "compile-time constant false" ... subroutine scoped lexicals are not cleared when the subroutine exits, ...
    (perl.dbi.users)