in reply to Assign in loop with and without declaration

Don't use a statement modifier on an my. It's a bug to do so. This is even explicitly mentioned in perlsyn.

There is no answer to your "why?" since the docs specifically say that's Perl's behaviour in that situation can be anything. (That would include crashing.)

Replies are listed 'Best First'.
Re^2: Assign in loop with and without declaration
by andreas1234567 (Vicar) on May 22, 2008 at 09:35 UTC
    Thank you for directing me to the documentation that says:
    NOTE: The behaviour of a my statement modified with a statement modifier conditional or loop construct (e.g. my $x if ...) is undefined. The value of the my variable may be undef, any previously assigned value, or possibly anything else. Don't rely on it. Future versions of perl might do something different from the version of perl you try it out on. Here be dragons.
    My follow-up question is: Should there not at least be a warning issued when one attempts something as unpredictable as this?
    --
    No matter how great and destructive your problems may seem now, remember, you've probably only seen the tip of them. [1]
        Ah.. so a warning was added for perl v5.9.1 (perl591delta), nice.

        Do you think the warning

        "Deprecated use of my() in false conditional"
        should be extended to
        "Deprecated use of my() in false conditional or loop"
        which would then trigger for both of the following cases:
        $ /usr/local/bin/perl5.10.0 -w my $x if 0 __END__ Deprecated use of my() in false conditional at - line 2. $ /usr/local/bin/perl5.10.0 -w my $x = $_ for (1 .. 3); __END__
        --
        No matter how great and destructive your problems may seem now, remember, you've probably only seen the tip of them. [1]