in reply to Re^4: File::Temp survival and scope created by "do"
in thread File::Temp survival and scope created by "do"

If you use -MO=Concise,-exec and put the two programs side by side, one can see the scope (enter+leave) is literally missing.

do{1;my $x=bless{}}; print "Bar" do{my $x=bless{}}; print "Bar" ================================= ================================= 1 <0> enter 1 <0> enter 2 <;> nextstate(main 3 -e:1) v:{ 2 <;> nextstate(main 3 -e:1) v:{ 3 <0> enter v 4 <;> nextstate(main 4 -e:1) v 5 <0> pushmark s 3 <0> pushmark s 6 <@> anonhash sK* 4 <@> anonhash sK* 7 <@> bless sK/1 5 <@> bless sK/1 8 <0> padsv[$x:4,5] sRM*/LVINTRO 6 <0> padsv[$x:4,5] sRM*/LVINTRO 9 <2> sassign vKS/2 7 <2> sassign vKS/2 a <@> leave vKP b <;> nextstate(main 6 -e:1) v:{ 8 <;> nextstate(main 6 -e:1) v:{ c <0> pushmark s 9 <0> pushmark s d <$> const[PV "Bar"] s a <$> const[PV "Bar"] s e <@> print vK b <@> print vK f <@> leave[1 ref] vKP/REFC c <@> leave[1 ref] vKP/REFC

Replies are listed 'Best First'.
Re^6: File::Temp survival and scope created by "do"
by Eily (Monsignor) on Dec 11, 2018 at 00:09 UTC

    It's harder to tell in haukex's version though (without the -exec option) because the shorter version as an extra:  <@> scope vK ->- so it's kind of hard to say that the scope is obviously missing :P. I'm guessing that this is the local scope, that makes local work as intended, but the scope that is *enter*ed and *leave*d (yes I very English, thank you) in the longer version is the lifetime of the scalar.

      because the shorter version as an extra: <@> scope vK ->-

      The - at the start of the line means it's not reachable, though, which is why it doesn't show when using -exec.

      Update: Clarified. It previously said "The leading - ...".