kannan@oar.net (Kannan Varadhan) (06/21/91)
Systems are all SUN 4s running Sun OS 4.1. (one is a 4/110, the other a
4/40).
perl is verion 4.009. perl is interesting because it is easy to bring
out the error conditions trivially in it. Also, I am unable to
reproduce all possible execution patterns in C.
Three different programs exist.
1) A C version for reading all the entries in a dbm database...
The C version has a for loop as...
datum msgloc, msgstatus;
DBM *newmail;
newmail = dbm_open (slocal, O_RDONLY, 0600);
for (msgloc = dbm_firstkey (newmail); msgloc.dptr;
msgloc = dbm_nextkey (newmail)) {
msgstatus = dbm_fetch (newmail, msgloc);
}
dbmclose (newmail);
This version seems to miss out certain datapoints, that are "present" in
the database.
2) A perl version below, exhibits similar problems:
#! /usr/local/bin/perl
dbmopen (NEWMAIL, "NewMail", 0600);
while (($key,$val) = each %NEWMAIL) {
print STDOUT "$key->$val\n";
}
dbmclose (NEWMAIL);
3) On the contrary, the following version below, does not exhibit
the problem...
#! /usr/local/bin/perl
dbmopen (NEWMAIL, "NewMail", 0600);
foreach $i (keys %NEWMAIL) {
print STDOUT "$i->$NEWMAIL{$i}\n";
}
dbmclose (NEWMAIL);
Firstly, what's different in cases 2 and 3.
Secondly, Cases 1 and 2 give the same result, identically different from
case 3. Even otherwise, a straight forward scrutiny leads me to assume
that case 2 would yield code similar to case 1.
Therefore, how does perl execute case 3, such that it does not miss out
the data?
Thirdly, this seems to be a terrible ndbm bug on the SUNs, no?
I have backup copies of the dbm files, in case it would be interesting.
Puzzled,
Kannan
--
Kannan Varadhan, Internet Engineer (OARnet), +1 614 292 4137
Ohio Supercomputer Center, 1224, Kinnear Rd., Columbus, OH 43212