The word that I keep seeing left out of these replies is 'precedence'. It looks to me like there is confusion between
my ($x if undef);
and
(my $x) if undef;
It looks to me like you are expecting the latter and getting the former. I suspect 'if' is being evaluated as an operator, so it gets a higher precedence than the 'my' function, and confusion results.
Or I could be completely wrong.
Actually, the if being evaluated first is
exactly what we would want in any case. You are missing the
implication of the behavior, however. The variable, besides
being localized which is unexpected (until one realizes that
data scoping is done at compile-time in this case), also
becomes static; that is, it retains its value between calls,
which is unexpected behavior for a local via my
variable. See iakobski's reply in this thread
for more details.