in reply to When is $_ local and when is it not?

The answers are: 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.

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 $_.

-- Abigail