... using a previously defined lexical variable as a loop variable ... is a bad practice. ... you may be tempted to use that variable after the loop has finished and it almost certainly will not contain what you expect.
I agree this syntax is Bad Practice and should be avoided, but the variable after the loop has finished will always contain exactly what you expect if you expect it to be absolutely unchanged:
c:\@Work\Perl\monks>perl -wMstrict -le
"my $x = 'foo';
print $x;
;;
for $x (7 .. 9) {
print qq{ $x};
}
;;
print $x;
"
foo
7
8
9
foo
This is because the loop variable, whatever it may be (
$x in this case), is "topicalized", i.e., localized upon entry to the loop and restored upon loop termination. This surprising bit of Perl-style
for-loop behavior (it's completely absent in the C-style
for-loop) is why this syntax
[Note 1] should be avoided IMHO. Otherwise, it makes no difference whatsoever AFAIK.
Notes:
-
... this syntax ... By which I mean
my $x = ...;
...
for $x (...) { ...; do_something_with($x); ...; }
Otherwise, the Perl-style
for my $x (...) { ...; do_something_with($x); ...; }
is the greatest thing since sliced bread!
Update: Added Note 1.
Give a man a fish: <%-{-{-{-<