in reply to quantum behavior in perl?

That looks like one of the closure bugs that Dave Mitchell fixed for Perl 5.9.x. In short, sometimes Perl doesn't see all references to lexical variables. Doubly-nested subs (an anonymous sub declared within a named sub) were one offender. Your string-eval construct looks like it could be another.

The solution for Perl 5.8.x and earlier is to refer to the lexical variable in the intervening scope so that Perl can close over it appropriately.

Replies are listed 'Best First'.
Re^2: quantum behavior in perl? (not fixed)
by tye (Sage) on Aug 18, 2007 at 06:18 UTC

    No, this isn't fixed in 5.9.5 (not in my copy anyway). And I'm not surprised, since parsing the string before eval gets run in order to check for this potential problem would only be a partial solution and could be an expensive one. The case of nested subs is easier to fix so I'm glad to hear that it has been addressed.

    - tye        

      Perl does parse the string, in the case of double quotes. (Actually, it has to parse every constant string in the program to find the closing quote, but that's not precisely what you meant):

      $ perl -MO=Concise my $foo = 'bar'; my $baz = "foo${foo}bar\n"; e <@> leave[1 ref] vKP/REFC ->(end) 1 <0> enter ->2 2 <;> nextstate(main 1 -:1) v ->3 5 <2> sassign vKS/2 ->6 3 <$> const[PV "bar"] s ->4 4 <0> padsv[$foo:1,3] sRM*/LVINTRO ->5 6 <;> nextstate(main 2 -:2) v ->7 d <2> sassign vKS/2 ->e - <1> ex-stringify sK/1 ->c - <0> ex-pushmark s ->7 b <2> concat[t4] sKS/2 ->c 9 <2> concat[t3] sK/2 ->a 7 <$> const[PV "foo"] s ->8 8 <0> padsv[$foo:1,3] s ->9 a <$> const[PV "bar\n"] s ->b c <0> padsv[$baz:2,3] sRM*/LVINTRO ->d - syntax OK

        I guess you didn't look at the rest of this thread. Of course Perl would parse it in the case of double quotes, and that would prevent the problem in the first place.

        The double quotes in the root node were (necessarily) a mis-copy.

        - tye