【问题标题】:Store and read hash and array in files in Perl在 Perl 中存储和读取文件中的哈希和数组
【发布时间】:2012-05-27 22:02:33
【问题描述】:

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

【问题讨论】:

  • 您可以查看StorableData::Dumper等模块。
  • Data::Dumper 应该可以帮助您按原样存储数组/哈希。您可以通过 require/eval 重新使用它们

标签: arrays perl file hash save


【解决方案1】:

您正在寻找数据序列化。稳健的流行选择是SerealJSON::XSYAML::XS。鲜为人知的格式有:ASN.1AvroBERTBSONCBORJSYNCMessagePackProtocol BuffersThrift

其他经常提到的选择是StorableData::Dumper(或类似的)/eval,但我不推荐它们,因为 Storable 的格式取决于 Perl 版本,而eval 不安全,因为它执行任意代码。截至 2012 年,解析对应部分 Data::Undump 还没有取得很大进展。我也不推荐使用 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 };
}

从这里开始下一步是object persistence


另请阅读:Serializers for Perl: when to use what

【讨论】:

    【解决方案2】:

    Perlmonks 对序列化有两个很好的讨论。

    【讨论】:

      【解决方案3】:

      这实际上取决于您希望如何将数据存储在文件中。我将尝试编写一些基本的 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;
      }
      

      【讨论】:

      • 是的。使用现有的 CPAN 模块比使用原始代码更合适。
      • 对不起。我打算把它作为评论发布在那里。
      • 有趣且有用。这种方法在一些模块不容易安装的环境中很有价值。我同意首选方法是使用 Data::Dumper(近年来取得了长足的进步)或其他模块。
      【解决方案4】:

      如果您是新手,我只是建议使用 join() 从数组/哈希生成字符串,然后他们使用“打印”将其写入,然后读取并使用 split() 再次生成数组/哈希。这将是像 Perl 教课本示例那样更简单的方法。

      【讨论】:

      • 还有什么缺点?
      • 可能很难处理比数组或哈希更复杂的东西(例如多维数组)。
      • 当数据可以是任何字符串时,真正的问题就开始了,包括包含分隔符。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-24
      • 1970-01-01
      • 1970-01-01
      • 2017-01-22
      • 2013-11-10
      • 2014-07-13
      • 2010-12-08
      相关资源
      最近更新 更多