我尝试eval
输出Dumper
非常简单的 hashref,其中两个键具有相同的值(引用另一个哈希):
#!/usr/bin/env perl
use strict; use warnings;
use Data::Dumper;
my $foo = { data => 1 };
my $boo = {
x => $foo,
y => $foo,
};
my $VAR1;
my $bar = eval( Dumper( $boo ) );
print Dumper( $boo );
print Dumper( $bar );
Run Code Online (Sandbox Code Playgroud)
我希望$boo
and$bar
具有相同的结构,但 eval 似乎没有$VAR1->{'x'}
正确解决内部引用,我希望最后两行打印相同的字符串:
$VAR1 = {
'x' => {
'data' => 1
},
'y' => $VAR1->{'x'}
};
Run Code Online (Sandbox Code Playgroud)
但是第二个有x
或y
未定义(取决于以字面形式引用的内容):
$VAR1 = {
'x' => {
'data' => 1
},
'y' => undef
};
Run Code Online (Sandbox Code Playgroud)
我在 doc 上尝试了简单的使用部分,它以更复杂的结构(no strict
, 然而)给出了很好的结果,但我无法用我的数据完成它,并有 2 个对相同哈希的引用。
我在这里缺少什么?
要正确捕获结构内的引用,您需要设置Purity
标志(有关详细信息,请参阅Data::Dumper文档)。
$Data::Dumper::Purity = 1;
Run Code Online (Sandbox Code Playgroud)
但这还不够,因为Dumper($boo)
现在将返回
$Data::Dumper::Purity = 1;
Run Code Online (Sandbox Code Playgroud)
所以,你不能只是eval
这个字符串,你还需要从中返回$VAR1
。
为了防止纯度标志干扰代码的其他部分,您可以在本地设置它:
$VAR1 = {
'y' => {
'data' => 1
},
'x' => {}
};
$VAR1->{'x'} = $VAR1->{'y'};
Run Code Online (Sandbox Code Playgroud)