为什么不正确评估转储器输出?

w.k*_*w.k 3 perl eval

我尝试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)

我希望$booand$bar具有相同的结构,但 eval 似乎没有$VAR1->{'x'}正确解决内部引用,我希望最后两行打印相同的字符串:

$VAR1 = {
          'x' => {
                   'data' => 1
                 },
          'y' => $VAR1->{'x'}
        };
Run Code Online (Sandbox Code Playgroud)

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

$VAR1 = {
          'x' => {
                   'data' => 1
                 },
          'y' => undef
        };
Run Code Online (Sandbox Code Playgroud)

我在 doc 上尝试了简单的使用部分,它以更复杂的结构(no strict, 然而)给出了很好的结果,但我无法用我的数据完成它,并有 2 个对相同哈希的引用。

我在这里缺少什么?

cho*_*oba 5

要正确捕获结构内的引用,您需要设置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)