in reply to Re^6: Storable and passed filehandles (ref to glob)
in thread Storable and passed filehandles

Then you are trying to retrieve from an empty file, which fails so nothing ever gets stored to it.

- tye        

  • Comment on Re^7: Storable and passed filehandles (no header)

Replies are listed 'Best First'.
Re^8: Storable and passed filehandles (no header)
by blahblah (Friar) on Aug 16, 2005 at 02:24 UTC
    and if I was more careful about analyzing error output I would have seen that. Damn tye, you rock.

    So fd_retrieve doesn't work on an empty file, it only works on storable data. I would think it should return an empty hashref - but hey, it doesn't and I can deal with that now that I know it.

    The working revised code:
    #!/usr/bin/perl -w # start with no existing giant.db file use strict; use Fcntl qw(:DEFAULT :flock); use Storable qw(store_fd fd_retrieve retrieve); use Data::Dumper; $Data::Dumper::Deepcopy=1; $Data::Dumper::Purity=1; $Data::Dumper::Sortkeys=1; my %data = ( 1 => 'FEE', 2 => 'FYE', 3 => 'FOH', 4 => 'FUM', ); my $exists = (-e "giant.db"?1:0); sysopen(*DB, "giant.db", O_RDWR|O_CREAT, 0666) or die("sysopen: $!\n") +; flock(*DB, LOCK_EX) or die("flock: $!\n"); my $hashref = $exists?fd_retrieve(*DB):{}; # modify the data, do work, etc.. $hashref->{$_} = $data{$_} for sort keys %data; store_fd($hashref, *DB) or die("store_fd: $!\n"); truncate(*DB, tell(*DB)); close(*DB);

    and you can check the resultant giant.db file on the command line with:
    perl -MStorable -MData::Dumper -e '{print Dumper(retrieve("giant.db")) +}'

    Thanks!