Perl でシリアライズとデシリアライズを行う必要があります。Data::Dumper
と がこの仕事に最適ではないことは承知していeval
ますが、私が取り組んでいるレガシー スクリプトでこの側面を変更することは許可されていません。
以下に 2 つの使用方法 ( CODE 1とCODE 2 ) を示しますeval
。CODE 1
では、ハッシュは を介して逆シリアル化される前に文字列として使用できます。CODE 2
では、ハッシュは を使用してシリアライズされてから、 を介してデシリアライズされます。 eval
Dumper
eval
どちらのコード サンプルでも、逆シリアル化を試みる 2 つの方法のうちの 1 つが機能します。逆シリアル化する他の方法が機能しないのはなぜですか?
コード 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
};
]