The jury is still debating whether this is a feature or a
bug. All I can offer is an explanation.
my has compile-time *and* run-time effects.
At compile time, the compiler knows about the variable,
etc. At run-time, values are set, my $x; makes
that $x becomes undef. So far,
However, for efficiency reasons, if Perl exits a block, it
will actually *not* delete any variables lexical to the block.
You cannot refer to them anymore (the compiler takes care
of that), but the data structure build for it remains. Perl
does this because it is likely that you reenter a block and
if the structure remains, Perl can save time rebuilding it.
However, with my $x if undef, no run-time effect
on $x happens when reentering
the block. (The first time the block is entered, the datastructure
gets build when $x is used). And since the
structure doesn't get rebuild, the value doesn't get reset
either. So, you have created a static variable....