【发布时间】:2016-03-28 11:19:39
【问题描述】:
我必须在 Perl 中进行序列化和反序列化。我知道Data::Dumper 和eval 不是最适合这项工作的,但我不允许在我正在处理的旧脚本中修改这方面。
以下是使用eval 的两种方式(CODE 1 和 CODE 2)。
在 CODE 1 中,哈希值在通过 eval 反序列化之前以字符串形式提供。
在 CODE 2 中,哈希使用Dumper 进行序列化,然后通过eval 进行反序列化。
在这两个代码示例中,两种尝试反序列化的方法之一都有效。为什么其他反序列化方法不起作用?
代码 1
my $r2 = "(
'w' => {
'k2' => 5,
'k1' => 'key',
'k3' => [
'a',
'b',
2,
'3'
]
},
'q' => 2
)";
my %z;
eval "\%z = $r2"; ####### Works.
print "\%z = [".Data::Dumper::Dumper (\%z)."] ";
my $answer = eval "$r2"; #### Does NOT work.
print "\n\nEvaled = [".Dumper($answer)."] ";
输出
%z = [$VAR1 = {
'w' => {
'k2' => 5,
'k1' => 'key',
'k3' => [
'a',
'b',
2,
'3'
]
},
'q' => 2
};
]
Evaled = [$VAR1 = 2;
]
但下面的代码以相反的方式工作:
CODE 2
my %a = ( "q" =>2, "w"=>{ "k1"=>"key", "k2"=>5, k3=>["a", "b", 2, "3",], }, ); **# Same hash as above example.**
$Data::Dumper::Terse=1;
$Data::Dumper::Purity = 1;
my $r2 = Dumper(\%a);
my %z;
eval '\%z = $r2';
print "\n\n\%z = [".Dumper(\%z)."] "; #### Does NOT work.
my $answer = eval $r2;
print "\n\nEvaled = [".Dumper($answer)."] "; ####### Works.
输出
%z = [$VAR1 = {};
]
Evaled = [$VAR1 = {
'w' => {
'k2' => 5,
'k1' => 'key',
'k3' => [
'a',
'b',
2,
'3'
]
},
'q' => 2
};
]
【问题讨论】:
标签: perl serialization deserialization eval data-dumper