为什么没有正确评估 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'}
        };

但是第二个有 xy 未定义(取决于以文字形式引用的):

$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 );