The answers are:
in reply to When is $_ local and when is it not?
In a few cases, $_ is implicitely localized:
in the block/expression of map and grep
and in the block of a foreach that doesn't have
its own iterator mentioned. (If the iterator is mentioned,
with no my preceeding it, the iterator is
localized too). This is all documented where foreach,
map and grep are documented:
perlsyn and perlfunc.
- Just because.... ;-)
There is a difference between foreach and
while because they are two totally different
things. foreach always assigns
to a variable when looping over a list, while while
normally doesn't. It's just that while (<>)
is an exception and only when there's a single diamond
operator there's an implicite assignment to $_.