【问题标题】:Perl Dumping array of hashesPerl 转储哈希数组
【发布时间】:2015-09-12 17:11:42
【问题描述】:

几乎刚从 perl 开始,并且在找出我在这 2 个潜艇上误入歧途的地方时遇到了一些麻烦。他们应该读取和写入哈希数组。当它只存储一个哈希时,我的代码可以工作,但是由于我试图将它调整为哈希数组,它似乎已经出错了,只是写每次一个 membersDb = []

sub ReadData {
    my($input) = new FileHandle "<$dat_file";
    local($/) = "";
    my($str) = <$input>;
    close $input;

    print "Input: $str";

    my($membersDb);
    eval $str;
    my(@current_members) = @$membersDb;
}

sub WriteData {
    my (@data) = @_;
    my $str = Data::Dumper->Dump([ \@data ], [ '$membersDb' ]);
    my($out) = new FileHandle ">$dat_file";
    print $out $str;
    close $out;
}

【问题讨论】:

  • 您可能应该使用JSON module 来序列化这样的数据结构

标签: arrays perl hash io


【解决方案1】:

正如我在评论中所写,序列化 Perl 数据有比Data::Dumper 更好的选择,而JSON 是更好的选择之一

但是,如果您有理由使用 Data::Dumper,那么您应该设置 Terse 选项,以便它不会生成像 $VAR1 或在您的情况下为 $membersDb 这样的变量名称。您还应该使用do 而不是读取文件并将eval 应用于内容

此代码按预期工作

use strict;
use warnings;

use Data::Dumper;

use constant MEMBERS_FILE => 'members.dat';

my $members_db = do MEMBERS_FILE;

my @data = @$members_db;

write_data(@data);

sub write_data {
    open my $fh, '>', MEMBERS_FILE or die $!;
    local $Data::Dumper::Terse = 1;
    print $fh Dumper(\@_);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-04
    • 1970-01-01
    • 2015-01-09
    • 2017-02-24
    • 2014-05-12
    • 1970-01-01
    • 2020-07-19
    • 2011-07-02
    相关资源
    最近更新 更多