Perl 5.30.0 is released (changelog). With it comes a breaking change for me. It has been a long time since I've faced a breaking change with perl.

Deprecated use of my() in false conditional.

I have been using this deprecated syntax liberally like so:



# This syntax generates a fatal error in perl 5.30 # # Initialize $foo # If $bar tests true, $foo = 'foobar' # If $bar tests false, $foo = undef my $foo = ' foobar ' if $bar ;

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.

This could make for interesting bugs. The scoped variable declared this way may unexpectedly persist data!



# Use this instead my $foo ; if ( $bar ) { $foo = ' foobar '; } # Or this my $foo ; $foo = ' foobar ' if $bar ;

According to RT# 133543, the deprecation will not always be triggered with this syntax! Therefore, I feel I can't trust a run of a test suite under 5.30 to identify all the offending code statements.

Is anybody else surprised to learn this declaration pattern is problematic?