我必須在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
你不需要改變所有的數據。只是改變你做任務的方式。 –