in reply to when does the definition of a my variable take effect?

you'll have to do something like
#!/usr/bin/perl use strict; use warnings; print my $r = do { my $r; $r += $_ for 1..3; $r }
to get what you want to run under strict and warnings.

from the manual...

> perldoc -f do
    do BLOCK
            Not really a function. Returns the value of the last command in
            the sequence of commands indicated by BLOCK. When modified by a
            loop modifier, executes the BLOCK once before testing the loop
            condition. (On other statements the loop modifiers test the
            conditional first.)

            "do BLOCK" does *not* count as a loop, so the loop control
            statements "next", "last", or "redo" cannot be used to leave or
            restart the block. See perlsyn for alternative strategies.

<snip>

you're executing a code block within do -- with a new scope. you'll need a my'd var there. also, you need to explicitly list the variable as the last statement in the block, in order to return the proper value.

~Particle *accelerates*