This issue was also recently raised on P2P/RT, here. Also:
$ perl -wMdiagnostics -e 'my $x if 0'
Deprecated use of my() in false conditional at -e line 1 (#1)
(D deprecated) You used a declaration similar to my $x if 0. There
has been a long-standing bug in Perl that causes a lexical variable
not to be cleared at scope exit when its declaration includes a false
conditional. Some people have exploited this bug to achieve a kind of
static variable. Since we intend to fix this bug, we don't want people
relying on this behavior. You can achieve a similar static effect by
declaring the variable in a separate block outside the function, eg
sub f { my $x if 0; return $x++ }
becomes
{ my $x; sub f { return $x++ } }
Beginning with perl 5.9.4, you can also use state variables to have
lexicals that are initialized only once (see feature):
sub f { state $x; return $x++ }
|