Well, Foreach Loops’s use of the word “local” is somewhat misleading, as it suggests dynamic scoping (via the local keyword), whereas the scoping here is lexical. The Camel Book (4th Edition, page 143, underlining added) is a little clearer:
The loop variable is valid only from within the dynamic or lexical scope of the loop and will be implicitly lexical if the variable was previously declared with my. This renders it invisible to any function defined outside the lexical scope of the variable, even if called from within that loop. However, if no lexical declaration is in scope, the loop variable will be a localized (dynamically scoped) global variable; this allows functions called from within the loop to access that variable. In either case, any previous value the localized variable had before the loop will be restored automatically upon loop exit.
The dynamic scoping of a global variable can be easily seen by changing my $i = 6; to our $i = 6; in NetWallah’s example.
Hope that helps,