如何解决如何使用数据转储程序在 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;
}
- 如果您可以将自己限制为 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,6
],"abc" : 123
}
(注意:我当然更愿意为此使用专用的 JSON 处理模块,但您问了......)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。