我必须在Perl中进行序列化和反序列化。我知道Data::Dumper
和eval
不适合这份工作,但我不允许在我正在处理的旧脚本中修改这方面的内容。
使用eval
有两种方法(代码1和代码2)。
在CODE 1,在通过eval
进行反序列化之前,散列可以以字符串形式提供。
在CODE 2,在通过eval
进行反序列化之前,使用Dumper
对散列进行序列化。Perl eval Data :: Dumper不一致
在这两个代码示例中,两种试图反序列化作品的方法之一。为什么反序列化的另一种方式不起作用?
CODE 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
};
]
感谢您的时间。目前,我正在使用模式匹配和替换来更改带圆括号的前导和尾随大括号。我们可以用其他方式做到吗?另外,我删除了星星。我应该把它们放在#后面。 – gsinha
你不需要改变所有的数据。只是改变你做任务的方式。 –