Today, I stumbled over something in Perl I was not aware of: it "localizes" the variable that the elements of the list iterated over is assigned to.
This, of course, is documented in the Perl documentation - however I failed to remember or read it.
The following script demonstrates what I mean:
use warnings;
use strict;
my $g = 99;
foreach $g (1..5) {
p($g);
}
sub p {
my $l = shift;
printf ("%2d %2d\n", $g, $l);
}
The script prints
99 1
99 2
99 3
99 4
99 5
because $g
is "localized" to the foreach
loop.
As far as I can tell there is no difference if I had added my
to $g
in the foreach loop:
foreach my $g (1..5) {
Actually, I ended up doing it because I feel it makes it clearer that the variable is local to the loop.
My question is now: is there a scenario where my using my
does make a difference (given that $g
is already declared globally).
The investigated behavior is documented in Foreach Loops in perlsyn
The
foreach
loop iterates over a normal list value and sets the scalar variable VAR to be each element of the list in turn. If the variable is preceded with the keywordmy
, then it is lexically scoped, and is therefore visible only within the loop.
which continues to the explanation
Otherwise, the variable is implicitly local to the loop and regains its former value upon exiting the loop. If the variable was previously declared with
my
, it uses that variable instead of the global one, but it's still localized to the loop.
Thus there should be no difference between localizing it with my
or leaving that to foreach
.
A little curiosity is that
This implicit localization occurs only in a
foreach
loop.
All this is further clarified in this snippet from Private Variables via my()
from perlsub
The
foreach
loop defaults to scoping its index variable dynamically in the manner oflocal
. However, if the index variable is prefixed with the keywordmy
, or if there is already a lexical by that name in scope, then a new lexical is created instead.
Since a new lexical is created inside in both cases there cannot be any practical difference.
I absolutely support and recommend (always) having a my
there.