Quote diotalevi:
my() has a runtime effect. You *always* (unless you're doing something freakish) want that to happen. The my $var STATEMENT-MODIFIER allows the runtime part of my() to potentially not happen.
In other words,
my $var = ... if/unless/while/for/foreach ...
is wrong and/or buggy. Use
my $var;
$var = ... if/unless/while/for/foreach ...
instead
In this case, replace
my $v2 = -2 if 0;
with
my $v2;
$v2 = -2 if 0;
PS - You post here regularly. You should start heeding "Clean Your Room" in How (Not) To Ask A Question and start indenting your code.