Anonymous Monk has asked for the wisdom of the Perl Monks concerning the following question:

Monks,

I am trying to understand how NDBM and tie works in Perl. There fore in order to do that I wrote a small code snippet. shown below.

#!/usr/bin/perl + + + use strict; use Fcntl; use NDBM_File; my %simple_hash = { "a" => 1 , "b" => 2 }; tie(%simple_hash,"NDBM_File","samplefile.dbmx",O_RDWR|O_CREAT, 0666) o +r die ("Cannot tie the dbm file"); untie(%simple_hash); $simple_hash{"hi"} = "this works"; tie(%simple_hash,"NDBM_File","samplefile.dbmx",O_RDWR|O_CREAT, 0666) o +r die ("Cannot tie the dbm file"); untie(%simple_hash); my %new_hash; tie(%new_hash,"NDBM_File","samplefile.dbmx",O_RDWR|O_CREAT, 0666) or d +ie ("Cannot tie the dbm file"); foreach my $keys (%new_hash) { print "$new_hash{$keys}\n"; } untie(%new_hash);
This code doesn't print out anything. Shouldn't it dump everything in the dbm file(First two times) and then read them back when I it again the last time. Also two dbm files are created with .pag and .dir extension. I am basically looking at a small storage sort of thing for my hashes.

Replies are listed 'Best First'.
Re: How to work NDBM and tie
by moritz (Cardinal) on Feb 25, 2011 at 10:04 UTC

    I'm pretty sure you're meant to use NDBM this way: tie an empty hash, add and read values, and then untie.

    If you untie before adding elements, you shouldn't be surprised if they don't end up in the storage file.

      How do I tie a hash to an already existing NDBM file and only read from it?

        Reading the docs, I'd suspect that it would be as simple as this:

        $ cat ex_NDBM_File_2.pl use strict; use warnings; use Fcntl; use NDBM_File; tie(my %h, 'NDBM_File', 'ex_NDBM_File.ndbm', O_RDONLY, 0777) or die; for my $k (sort keys %h) { print "$k --> '$h{$k}'\n"; } $ perl ex_NDBM_File_2.pl bar --> 'testing 12 .. hello, testing 12!' foo --> '123 test'

        I prepared the NDBM file like so:

        $ cat ex_NDBM_File_1.pl use strict; use Fcntl; use NDBM_File; tie(my %h, 'NDBM_File', 'ex_NDBM_File.ndbm', O_RDWR|O_CREAT, 0777) or +die; $h{foo}='123 test'; $h{bar}='testing 12 .. hello, testing 12!'; $ perl ex_NDBM_File_1.pl $

        ...roboticus

        When your only tool is a hammer, all problems look like your thumb.

        The exact same way, maybe using only O_RDONLY flag