$_ is a global variable. It is best to save it for inner loops,
but if you must do it like this give it a seperate value for the scope of do_something with local($_).
Updated:
Okay thanks for correcting me extremly, but it seem to me to make more sense (and is clearer) if $_ is saved for innermost loops.
For example this could be clearer:
while (<>) {
for (split /-/,$_) {
print $_ . "\n";
}
}
| [reply] [d/l] |
Um this isn't exactly true... Run this... $_ isn't GLOBAL,
it is LOCALized automatically. The inner and outer loops
each have their own $_ but the "current" $_ is still in
scope in the supbroutine called...
#!/usr/bin/perl -w
use strict;
my @l=qw( a b 3 d );
foreach (@l) {
print "$_ = ";
foreach (@l) {
print "$_ ";
}
print "\n";
}
foreach (@l) {
icky();
}
sub icky {
print "$_ = ";
foreach (@l) {
print "$_ ";
}
print "\n";
}
You don't need to local($_) inside a foreach loop.
--
$you = new YOU;
honk() if $you->love(perl) | [reply] [d/l] |
As repson says $_ is a global, to preserve your initial array I guess you'd have to protect it with while (local $_ = <IN>) { in the do_something sub
And now, as he looked and saw the whole Hellespont covered with the vessels of his fleet, and all the shore and every plain about Abydos as full as possible of men, Xerxes congratulated himself on his good fortune; but after a little while he wept...
Asked why he was weeping he replied ..."There came upon me," replied he, "a sudden pity, when I thought of the shortness of man's life, and considered that of all this host, so numerous as it is, not one will be alive when a hundred years are gone by."
The History of Herodotus By Herodotus Written about 440 B.C.
| [reply] [d/l] |
I think it's a lot more readable to simply say:
local $_;
at the top of do_something. No sense in making Perl do localization work for every iteration of the loop.
Generally (and this is for everyone else), if you use any functions that make use of $_ in this fashion, you should remember to mask its global value while you use it (via local), so that when your function returns, anything that depends on the value of $_ elsewhere won't be disappointed. | [reply] [d/l] [select] |