IMPORTANT: Please do not post solutions, hints, or other spoilers until at least 60 hours after the date of this message. Thanks. IMPORTANTE: Por favor, no enviéis soluciones, pistas, o cualquier otra cosa que pueda echar a perder la resolución del problema hasta que hayan pasado por lo menos 60 horas desde el envío de este mensaje. Gracias. IMPORTANT: S'il vous plaît, attendez au minimum 60 heures après la date de ce message avant de poster solutions, indices ou autres révélations. Merci. WICHTIG: Bitte schicken Sie keine Lösungen, Tipps oder Hinweise für diese Aufgabe vor Ablauf von 60 Stunden nach dem Datum dieser Mail. Danke. BELANGRIJK: Stuur aub geen oplossingen, hints of andere tips in de eerste 60 uur na het verzendingstijdstip van dit bericht. Waarvoor dank. VNIMANIE: Pozhalujsta ne shlite reshenija, nameki na reshenija, i voobshe lyubye podskazki v techenie po krajnej mere 60 chasov ot daty etogo soobshenija. Spasibo. Qing3 Zhu4Yi4: Qing3 Ning2 Deng3Dao4 Jie1Dao4 Ben3 Xin4Xi2 Zhi1Hou4 60 Xiao3Shi2, Zai4 Fa1Biao3 Jie3Da2, Ti2Shi4, Huo4 Qi2Ta1 Hui4 Xie4Lou4 Da2An4 De5 Jian4Yi4. Xie4Xie4. ---------------------------------------------------------------- This week's quiz is to write a limited replacement for the CPAN 'MLDBM' module. The purpose of MLDBM is to allow storage of complex Perl data structures in a DBM file. The typical DBM implementation (such as SDBM_File, which comes standard with Perl) allows the programmer to manipulate a disk database as if it were an ordinary hash variable. One says something like tie %hash, 'SDBM_File', $filename; and thereafter, $hash{"key"} = "value"; stores "value" in the disk file under the key "key", and $x = $hash{"key"}; rerieves the value again. But most DBM implementations are limited to storing plain strings as values. Attempting to store undef as a value actualy stores the empty string instead, so that $hash{"key"} = undef; print defined($hash{"key"}) ? "oops" : "OK"; prints "oops". Similarly, attempting to store a compound object such as [1, 2, 3] or {name => "bill", numbers => [1, 2, 3] } actually stores a useless string like "ARRAY(0x436c1d)" or "HASH(0x436c1d)". Similarly, $hash{"this"}{"that"} = "ouch"; causes a "strict refs" failure, if you have "strict refs" checking on, and a bizarre error if not. (Sub-quiz: Why?) The purpose of MLDBM is to work around this. (See http://search.cpan.org/~chamas/MLDBM-2.01/lib/MLDBM.pm for complete details.) Your task this week is to write a version of MLDBM. It should be a tied hash class named 'ML_DBM', such that after tie %mldbm, 'ML_DBM', \%hash; the user can access %mldbm as if it were an ordinary hash, but all data apparently stored in %mldbm is actually stored in %hash instead. For example, this must work: $mldbm{'array'} = [5,6,7]; print $mldbm{'array'}[2]; # This must print 7 as must this: $mldbm{'hash'} = { I => { like => "pie" } } print $mldbm{'hash'}{'I'}{'like'}; # This must print "pie" and this: $mldbm{'a'}{'a2'} = 'AA'; $z = $mldbm{'a'}; $z->{'b2'} = "BB"; print $mldbm{'a'}{'b2'}; # This must print "b2" There is a trivial solution to this, which is just to store the values into %hash and fetch them back as requested. However, this quiz has a restriction which rules out that solution: The values that ML_DBM stores in %hash must always be ordinary strings. The idea is that the user can tie %hash to their favorite DBM implementation, and then use that as the backing hash for ML_DBM: tie %hash => 'NDBM_File', $filename or die ...; tie %db => 'ML_DBM', \%hash; and ML_DBM will (unknowingly, but faithfully) store the data into the underlying disk file via %hash. ML_DBM must restrict the values it stores into %hash to ordinary strings, or else the underlying DBM implementation (NDBM_File in this case) will not faithfully preserve them.