in reply to Re^2: will you explain what's going on?
in thread will you explain what's going on?

Perl doesn't (always) clear lexical variables with refcounts of zero at scope exit (it's an optimization).
Under normal circumstances, Perl always clears the variable; the optimisation is that it never frees it. The bug is that the run-time effect of of my is to push an instruction onto the savestack to clear the variable on scope exit. If the my is skipped, the var doesn't get cleared on scope exit, and its old value is still there at the next entry to the block. (Note that on entry to a block, my doesn't clear the variable).

Some people have used this as a way of getting static vars, but this is officially deprecated these days.

Dave.

  • Comment on Re^3: will you explain what's going on?

Replies are listed 'Best First'.
Re^4: will you explain what's going on?
by maard (Pilgrim) on Oct 27, 2004 at 10:29 UTC
    Oh, thank you very much!++
    Now everything is on it's place.
    Final question: how can one find out the answer to the question like this one? Looking through perl source code? Because I'd like to find the answer myself but sometimes stuck into not knowing even where to look into...
      Since this effect depends on how a lot of different pieces work, you won't find it easily in the source code. But the last paragraph of the section of perlsyn on statement modifiers says (beginning in 5.8.1, anyway):
      NOTE: The behaviour of a my statement modified with a statement modifier conditional or loop construct (e.g. my $x if ...) is undefined. The value of the my variable may be undef, any previously assigned value, or possibly anything else. Don't rely on it. Future versions of perl might do something different from the version of perl you try it out on. Here be dragons.