我是菜鸟。我需要一些关于如何在 perl 下保存和读取数据的基本知识。说要保存一个哈希和一个数组。应该使用什么格式(扩展名)的文件?文本?到目前为止,我只能将所有内容保存为 stringprint FILE %hash
并将它们读回 string print <FILE>
。如果我需要来自文件的函数哈希和数组输入,我应该怎么做。如何将它们放回散列和数组?
4 回答
您正在寻找数据序列化。稳健的流行选择是Sereal、JSON ::XS和YAML::XS。鲜为人知的格式有:ASN.1、Avro、BERT、BSON、CBOR、JSYNC、MessagePack、Protocol Buffers、Thrift。
其他经常提到的选择是Storable和Data::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 };
}
从这里开始的下一步是对象持久性。
另请阅读:Perl 的序列化程序:何时使用什么
Perlmonks 对序列化有两个很好的讨论。
这实际上取决于您希望如何将数据存储在文件中。我将尝试编写一些基本的 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;
}
如果您是新手,我只是建议使用 join() 从数组/散列生成字符串,然后他们使用“print”将其写入,然后读取并使用 split() 再次生成数组/散列。这将是更简单的方式,例如 Perl 教课本示例。