in reply to why need my in a foreach loop?

use strict 'vars' basically says "all variables that you use must be declared (unless they contain :: or ').

Using a variable in a loop is not different from using a variable in an assignment: it can either use an existing one, or it can be a fresh one, declared with my.

Or put another way: use strict; forces you to be explicit about your declarations. Having some construct doing implicit declarations, at least in some circumstances, goes against the entire idea of strict.

Update: Perl 6 gets around this by having other declarative syntax forms. Signatures can be used for that, either by being attached to a routine, or in the form of a lambda:

# | declares $x in the scope of the block my $lambda = -> $x { $x * $x } # reused in loop syntax: for <a b cd> -> $x { say $x } # | declares $x in the scope of the block sub square($x) { $x * $x }