dave@dlb.uucp (Dave Buck) (01/25/90)
OK, it looks like a bug to me. I'm accepting opinions.
Below, test.4 calls a subroutine within a "foreach" loop. Within the
subroutine, there is a "while" loop. The local variables get
trounced upon completion of the "while", it seems.
Test.5 calls the same subroutine, but not from a "foreach".
The local variables don't get trounced.
RTFM'ing under "local(LIST)", "... this operator works by saving the current
values of those variables in LIST on a hidden stack and restoring them upon
exiting the block, subroutine or eval." So I'm a thinkin' that someone gets
confused by that foreach block. As I said, I'm accepting opinions.
Script started on Wed Jan 24 11:57:46 PST 1990
$ cat test.4
#!/usr/bin/perl -P -I/dave/projects
eval "exec /usr/bin/perl -P -I/dave/projects $0 $*"
if $running_under_some_shell;
foreach $dt (('5/1/87','11/1/87')) {
$e_date = &mdy2epoch($dt);
}
sub mdy2epoch {
local ($mdy) = @_;
local (@mdmax) = (0,31,28,31,30,31,30,31,31,30,31,30,31);
local ($m,$d,$y,$e);
($m,$d,$y) = split('/',$mdy);
print "mdy2epoch($mdy): $m $d $y\n";
$y -= 1900 if ($y > 1900);
$y -= 80;
print "y: $y ";
$mdmax[2] = 29 if (($y%4) == 0);
$e = $y * 365 + 1 + int(($y-1)/4);
print "e: $e y: $y m: $m ";
while (--$m) {
$e += $mdmax[$m];
}
print "m: $m e: $e d: $d ";
$e += $d;
print "return $e\n"; $e;
}
$ perl test.4
mdy2epoch(5/1/87): 5 1 87
y: 7 e: 2557 y: 7 m: 5 m: e: d: return 0
mdy2epoch(11/1/87): 11 1 87
y: 7 e: 2557 y: 7 m: 11 m: e: 0 d: return 0
$ cat test.5
#!/usr/bin/perl -P -I/dave/projects
eval "exec /usr/bin/perl -P -I/dave/projects $0 $*"
if $running_under_some_shell;
$dt = '5/1/87';
$e_date = &mdy2epoch($dt);
sub mdy2epoch {
local ($mdy) = @_;
local (@mdmax) = (0,31,28,31,30,31,30,31,31,30,31,30,31);
local ($m,$d,$y,$e);
($m,$d,$y) = split('/',$mdy);
print "mdy2epoch($mdy): $m $d $y\n";
$y -= 1900 if ($y > 1900);
$y -= 80;
print "y: $y ";
$mdmax[2] = 29 if (($y%4) == 0);
$e = $y * 365 + 1 + int(($y-1)/4);
print "e: $e y: $y m: $m ";
while (--$m) {
$e += $mdmax[$m];
}
print "m: $m e: $e d: $d ";
$e += $d;
print "return $e\n"; $e;
}
$ perl test.5
mdy2epoch(5/1/87): 5 1 87
y: 7 e: 2557 y: 7 m: 5 m: 0 e: 2677 d: 1 return 2678
$ Script done on Wed Jan 24 11:58:32 PST 1990
--
Dave Buck {amdahl,sun,megatest,plx,ardent,ubvax}!dlb!dave
D. L. Buck and Associates, Inc.; San Jose, California 95119; (408)972-2825