in reply to when is "my" not necessary?

This happens because when you do
$$_ = foo ;
you are setting to a GLOBAL variable, not lexical (defined by my). So if $_ is equal 'zero' you are setting:
$main::zero = foo ;
To really set a lexical variable you should use eval:
eval("\$$_ = foo") ;
Note that when you write
my $zero ; ... print "$zero" ;
the $zero variable inside the string to be printed will point to a lexical variable, and all the symbolic references are evaluated at runtime and will point to the package (symbol table), in other words, will point to a global variable.