意外数据:: Dumper :: Dumper结果

时间:2014-08-06 09:29:56

标签: perl

为什么这里Data::Dumper :: Dumper会打印$VAR1->{'AA'}[2]而不是{ 1 => 6 }

#!/usr/bin/env perl
use warnings;
use strict;
use 5.10.0;

my @a = ( 'a', 'b', { 1 => 6 } );
my %h = (
    'AA' => [ @a ],
    'BB' => [ @a ],
);


say $h{BB}->[2]{1};

use Data::Dumper;
say Dumper \%h;

输出:

6
$VAR1 = {
        'AA' => [
                    'a',
                    'b',
                    {
                    '1' => 6
                    }
                ],
        'BB' => [
                    'a',
                    'b',
                    $VAR1->{'AA'}[2]
                ]
        };

2 个答案:

答案 0 :(得分:7)

在您的示例中,$VAR1->{'AA'}[2]$VAR1->{'BB'}[2]是对同一哈希的引用。

Data::Dumper不想多次打印变量。此行为更忠实地表示数据结构,并且它避免了可能遇到的任何无限循环。 e.g:

my $loop;
$loop = { 1 => \$loop };
print Dumper $loop;

输出

$VAR1 = {
     '1' => \$VAR1
};

答案 1 :(得分:3)

Data::Dumperconfiguration variables,可以更改避免多次打印参考的行为。

  
      
  • $Data::Dumper::Deepcopy$OBJ->Deepcopy([NEWVAL])

         

    可以设置为布尔值以启用结构的深层副本。然后仅在绝对必要时(即,打破参考周期)才进行交叉引用。默认值为0.

  •   

要将其集成到您的脚本中,只需本地化变量:

say do {
    local $Data::Dumper::Deepcopy = 1;
    Dumper \%h;
};

输出:

$VAR1 = {
          'AA' => [
                    'a',
                    'b',
                    {
                      '1' => 6
                    }
                  ],
          'BB' => [
                    'a',
                    'b',
                    {
                      '1' => 6
                    }
                  ]
        };