在Perl中的文件中存储和读取哈希和数组

时间:2012-05-21 11:46:35

标签: arrays perl file hash save

我是一个菜鸟。我需要一些关于如何在perl下保存和读取数据的基本知识。说保存哈希和数组。应该使用什么格式(扩展名)的文件?文本?到目前为止,我只能将所有内容保存为字符串print FILE %hash,并将其作为字符串print <FILE>读回。如果我需要来自文件的函数哈希和数组输入,我该怎么办?如何将它们放回哈希和数组?

4 个答案:

答案 0 :(得分:20)

您正在寻找数据序列化。热门的热门选择是SerealJSON ::XSYAML::XS。鲜为人知的格式包括:ASN.1AvroBERTBSONCBORJSYNCMessagePack,{{3 },Protocol Buffers

其他经常提到的选择是ThriftStorable(或类似)/ eval,但我不推荐它们,因为Storable的格式依赖于Perl版本,eval是不安全,因为它执行任意代码。截至2012年,解析对应部分Data::Dumper尚未进展很远。我也不建议使用XML,因为它没有很好地映射Perl数据类型,并且存在多个竞争/不兼容的模式,如何在XML和数据之间进行转换。


代码示例(已测试):

use JSON::XS qw(encode_json decode_json);
use File::Slurp qw(read_file write_file);
my %hash;
{
    my $json = encode_json \%hash;
    write_file('dump.json', { binmode => ':raw' }, $json);
}
{
    my $json = read_file('dump.json', { binmode => ':raw' });
    %hash = %{ decode_json $json };
}

use YAML::XS qw(Load Dump);
use File::Slurp qw(read_file write_file);
my %hash;
{
    my $yaml = Dump \%hash;
    write_file('dump.yml', { binmode => ':raw' }, $yaml);
}
{
    my $yaml = read_file('dump.yml', { binmode => ':raw' });
    %hash = %{ Load $yaml };
}

下一步是Data::Undump


另请阅读:object persistence

答案 1 :(得分:3)

Perlmonks在序列化方面有两个很好的讨论。

答案 2 :(得分:1)

这实际上取决于您希望如何将数据存储在文件中。我将尝试编写一些基本的perl代码,使您能够将文件读入数组,或者将哈希值写回文件。

#Load a file into a hash.
#My Text file has the following format.
#field1=value1
#field2=value2  
#<FILE1> is an opens a sample txt file in read-only mode.
my %hash;
while (<FILE1>)
{
  chomp;
  my ($key, $val) = split /=/;
  $hash{$key} .= exists $hash{$key} ? ",$val" : $val;
}

答案 3 :(得分:0)

如果你是新的我只是建议使用join()从数组/散列生成字符串,然后用“print”编写它,然后读取并使用split()再次生成数组/散列。这将是更简单的方式,如Perl教学教科书示例。