如何使用数据转储器在perl中存储简单的散列


%hash = ('abc' => 123, 'def' => [4,5,6]);

如何使用Perl中的数据转储器将上述哈希存储在文件中

文件只能包含字节序列,因此需要以某种方式将数据结构转换为字节序列。这个过程称为序列化。

可用的可能性是无限的,但有几个值得一提:

  • JSON是一个非常常见的选择
  • YAML更灵活
  • Storable是专门为Perl数据结构而设计的

正如您所说,还有Data::Dumper。

use Data::Dumper qw( );
sub serialize {
my ($x) = @_;
local $Data::Dumper::Purity = 1;    # Required for some data structures.
local $Data::Dumper::Useqq = 1;     # Optional. Limits output to ASCII.
local $Data::Dumper::Sortkeys = 1;  # Optional. Makes revision control easier.
return Data::Dumper->Dump([$x], ["x"]);
}
print($fh serialize($x));

Data::Dumper不是一个特别好的选择,因为在Perl[1]中没有现有的模块可以安全地反序列化结构,而且Perl之外的支持更少。

sub deserialize {
my ($s) = @_;
my $x;
eval($s);       # XXX Unsafe!
die($@) if $@;
return $x;
}

  1. 如果您可以将自己限制为JSON可以序列化的数据结构(通过将Purity设置为0(,那么您可以使用data::Undump来安全地反序列化。但是为什么不直接使用JSON呢
use Data::Dumper
open (FL, ">", "file.txt") or die "Cant open file $! ";
print FL Dumper %hash;
close FL;

"我如何使用Perl中的数据转储器将上述散列存储在文件中

将其存储为JSON,以便(几乎(任何东西都可以读取它,使用配置为打印JSON的Data::Dumper

use strict;
use warnings;
use Data::Dumper;
local $Data::Dumper::Pair = ' : ';
local $Data::Dumper::Quotekeys = 1;
local $Data::Dumper::Useqq = 1;
local $Data::Dumper::Terse = 1;
my %hash = ('abc' => 123, 'def' => [4,5,6]);
open my $file, '>', 'foo.json' or die $!;
print $file Dumper %hash;

输出:

$ cat foo.json
{
"def" : [
4,
5,
6
],
"abc" : 123
}

(注意:我当然更愿意使用专用的JSON处理模块,但你问了……(

最新更新