Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl-Sensitive Sunglasses
 
PerlMonks  

Re: Using Data::Dumper to dump an array of hashes to a file

by kyle (Abbot)
on Aug 14, 2008 at 16:26 UTC ( [id://704384]=note: print w/replies, xml ) Need Help??


in reply to Using Data::Dumper to dump an array of hashes to a file

Here's a little demo:

use strict; use warnings; use Data::Dumper; my @aoh = ( { a => 1 } ); my $file = 'diskstats.perldata'; out( $file, \@aoh ); undef @aoh; @aoh = in( $file ); sub out { my ( $file, $aoh_ref ) = @_; open my $fh, '>', $file or die "Can't write '$file': $!"; local $Data::Dumper::Terse = 1; # no '$VAR1 = ' local $Data::Dumper::Useqq = 1; # double quoted strings print $fh Dumper $aoh_ref; close $fh or die "Can't close '$file': $!"; } sub in { my ( $file ) = @_; open my $fh, '<', $file or die "Can't read '$file': $!"; local $/ = undef; # read whole file my $dumped = <$fh>; close $fh or die "Can't close '$file': $!"; return @{ eval $dumped }; }

Notes:

  • I don't check here whether the eval succeeded, but that would be a good idea.
  • These are bad sub names.
  • These are not general dump/save subs. They're meant just for arrays.
  • Consider using YAML or Storable instead since it doesn't have the possibility of executing things if someone hostile gets a hold of the dump file.

Replies are listed 'Best First'.
Re^2: Using Data::Dumper to dump an array of hashes to a file
by wishartz (Beadle) on Aug 14, 2008 at 17:32 UTC
    Thanks for your reply.

    One thing that I don't understand, is why do I have to include the subroutine 'in' in my program for it to dump out the contents of the array? I thought the subroutine 'in' was what I was just using in my other program to read the file?

    And it only seems to dump it, if I press <crtl+c> and kill the program? Unless, it is just taking a long time to write the contents to disk?

      Sorry, my mistake. I had put the subroutines in the middle of my code, when they needed to be at the end, when I had finished with the array.

      Thanks again

Re^2: Using Data::Dumper to dump an array of hashes to a file
by alexm (Chaplain) on Aug 14, 2008 at 22:06 UTC
    sub in { my ( $file ) = @_; open my $fh, '<', $file or die "Can't read '$file': $!"; local $/ = undef; # read whole file my $dumped = <$fh>; close $fh or die "Can't close '$file': $!"; return @{ eval $dumped }; }

    Wouldn't do or require accomplish just the same task, but more succinctly?

      Mostly, yes.

      I wouldn't use require because it would decline to load the same file twice (unless you monkey with %INC). Also, I don't know if it would return the value returned by the file (I think it doesn't).

      Using do is a better choice, but the error handling is different. Here's some code I wrote a while back after examining the docs for a while:

      if ( ! defined do $rc_file ) { die "Error in '$rc_file': $@" if $@; die "Can't read '$rc_file': $!" if $!; warn "'$rc_file' returned undef as last value"; }

      It's not as easy as just "return @{ do $file }", but I admit I like it better. Using do has some other differences noted by the documentation, but nothing I'd expect to trip us up in this case.

        I wouldn't use require because it would decline to load the same file twice (unless you monkey with %INC). Also, I don't know if it would return the value returned by the file (I think it doesn't).

        It actually does :)

        I've been using require for a while to read simple config files: it does syntax error checking and the fact that it only loads once was not a big deal. However, I agree that YAML (or Config::IniFiles et al.) are safer and should be preferred.

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://704384]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others avoiding work at the Monastery: (2)
As of 2024-04-20 04:01 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found