A co-worker asked me about some odd behavior in a perl script. It
looked like a my variable in a loop was not getting reset to undef
during iterations. The my variable was declared with an if clause
(which is what causes the issue).
Here is a small script that duplicates the effect. The output of the
script follows.
############### SCRIPT START ############
#!/usr/bin/perl
use strict;
foreach my $i (0..10) {
print "start a=$i\n";
my $var = 'TWO' if $i == 2;
print "A: var = $var\n";
$var = 'FIVE' if $i == 5;
print "B: var = $var\n";
$var = 'EIGHT' if $i == 8;
print "C: var = $var\n";
}
############## SCRIPT END ################
Output of the script:
start a=0
A: var =
B: var =
C: var =
start a=1
A: var =
B: var =
C: var =
start a=2
A: var = TWO
B: var = TWO
C: var = TWO
start a=3
A: var =
B: var =
C: var =
start a=4
A: var =
B: var =
C: var =
start a=5
A: var =
B: var = FIVE
C: var = FIVE
start a=6
A: var = FIVE
B: var = FIVE
C: var = FIVE
start a=7
A: var = FIVE
B: var = FIVE
C: var = FIVE
start a=8
A: var = FIVE
B: var = FIVE
C: var = EIGHT
start a=9
A: var = EIGHT
B: var = EIGHT
C: var = EIGHT
start a=10
A: var = EIGHT
B: var = EIGHT
C: var = EIGHT
At the end of iteration a=2, the value of $var was set back to undef
(which is what I expected).
However, at the end of iteration a=5, $var seems to retain its value
during the next iteration of the loop (which I did not expect).
We fixed the issue by separating out the my $var declaration from the
if clause:
my $var;
$var = 'TWO' if $i == 2;
However, I don't understand why it behaved the way it did.
I tried searching the web, but the only thing close I found was
"variable suicide" which doesn't seem to be the issue.
My perl version (fromCentOS release 4.4) :
$ perl -v
This is perl, v5.8.5 built for i386-linux-thread-multi