为什么没有正确评估 Dumper 输出?
Why Dumper output is not evaluated correcty?
我尝试 eval
Dumper
的输出以获得非常简单的哈希引用,其中两个键具有相同的值(引用另一个哈希):
#!/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 );
我希望 $boo
和 $bar
具有相同的结构,但 eval 似乎无法正确解决 inner-ref $VAR1->{'x'}
,我希望最后两行打印相同的字符串:
$VAR1 = {
'x' => {
'data' => 1
},
'y' => $VAR1->{'x'}
};
但是第二个有 x
或 y
未定义(取决于以文字形式引用的):
$VAR1 = {
'x' => {
'data' => 1
},
'y' => undef
};
我在 doc 上尝试了 simple usage 部分,它给出了更复杂结构的良好结果(no strict
,但是),但是我不能用我的数据通过 2 个引用来完成它散列。
我在这里错过了什么?
要正确捕获结构内的引用,您需要设置 Purity
标志(有关详细信息,请参阅 Data::Dumper 文档)。
$Data::Dumper::Purity = 1;
但这还不够,因为 Dumper($boo)
现在 return
$VAR1 = {
'y' => {
'data' => 1
},
'x' => {}
};
$VAR1->{'x'} = $VAR1->{'y'};
所以,你不能只 eval
这个字符串,你还需要 return $VAR1
来自它。
为防止纯度标志干扰代码的其他部分,您可以在本地设置它:
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
my $foo = { data => 1 };
my $boo = {
x => $foo,
y => $foo,
};
my $VAR1;
my $bar = do {
local $Data::Dumper::Purity = 1;
eval Dumper( $boo );
$VAR1
};
print Dumper( $boo );
print Dumper( $bar );
我尝试 eval
Dumper
的输出以获得非常简单的哈希引用,其中两个键具有相同的值(引用另一个哈希):
#!/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 );
我希望 $boo
和 $bar
具有相同的结构,但 eval 似乎无法正确解决 inner-ref $VAR1->{'x'}
,我希望最后两行打印相同的字符串:
$VAR1 = {
'x' => {
'data' => 1
},
'y' => $VAR1->{'x'}
};
但是第二个有 x
或 y
未定义(取决于以文字形式引用的):
$VAR1 = {
'x' => {
'data' => 1
},
'y' => undef
};
我在 doc 上尝试了 simple usage 部分,它给出了更复杂结构的良好结果(no strict
,但是),但是我不能用我的数据通过 2 个引用来完成它散列。
我在这里错过了什么?
要正确捕获结构内的引用,您需要设置 Purity
标志(有关详细信息,请参阅 Data::Dumper 文档)。
$Data::Dumper::Purity = 1;
但这还不够,因为 Dumper($boo)
现在 return
$VAR1 = {
'y' => {
'data' => 1
},
'x' => {}
};
$VAR1->{'x'} = $VAR1->{'y'};
所以,你不能只 eval
这个字符串,你还需要 return $VAR1
来自它。
为防止纯度标志干扰代码的其他部分,您可以在本地设置它:
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
my $foo = { data => 1 };
my $boo = {
x => $foo,
y => $foo,
};
my $VAR1;
my $bar = do {
local $Data::Dumper::Purity = 1;
eval Dumper( $boo );
$VAR1
};
print Dumper( $boo );
print Dumper( $bar );