0

我有这样的代码:

@VAR1 = {
      'ID' => '1',
      'Name' => '"ABC"'
    },
    {
      'ID' => '2',
      'Name' => '"EFG"'
    };

我正在使用它,如下所示:

my @Var2 = ({
              'A' => "B",
              'C' => "D",
              'E' => \@Var1
              },
              {
              'A1' => "B1",
              'C1' => "D1",
              'E' => \@Var1
              });

所以当我在 AVar2 上做一个 Dumper 时,它是这样的:

$VAR1 = {
      'A' => 'B',
      'C' => 'D',
      'E' => [
                  {
                    'ID' => '1',
                    'Name' => '"ABC"'
                  },
                  {
                    'ID' => '2',
                    'Name' => '"EFG"'
                  };
             ]
    };


$VAR2 = { 'A' => 'B',
      'C' => 'D',
      'E' => $VAR1->{'E'}
    };

为什么在第二种情况下不打印。虽然它首先打印?

4

2 回答 2

1

看起来你在做

print(Dumper(@Var2));

当正确的用法是

local $Data::Dumper::Purity = 1;
print(Dumper(\@Var2));

这输出

$VAR1 = [
          {
            'A' => 'B',
            'C' => 'D',
            'E' => [
                     {
                       'ID' => '1',
                       'Name' => '"ABC"'
                     },
                     {
                       'ID' => '2',
                       'Name' => '"EFG"'
                     }
                   ]
          },
          {
            'A1' => 'B1',
            'E' => [],
            'C1' => 'D1'
          }
        ];
$VAR1->[1]{'E'} = $VAR1->[0]{'E'};

以上确实准确地重建了您的数据结构。你似乎期待

$VAR1 = [
          {
            'A' => 'B',
            'C' => 'D',
            'E' => [
                     {
                       'ID' => '1',
                       'Name' => '"ABC"'
                     },
                     {
                       'ID' => '2',
                       'Name' => '"EFG"'
                     }
                   ]
          },
          {
            'A1' => 'B1',
            'E' => [
                     {
                       'ID' => '1',
                       'Name' => '"ABC"'
                     },
                     {
                       'ID' => '2',
                       'Name' => '"EFG"'
                     }
                   ],
            'C1' => 'D1'
          }
        ];

但这并不等同于你所拥有的。在你原来的结构中,

  • $Var2[0]{E}并且$Var2[1]{E}都是对同一个数组的引用
  • $Var2[0]{E}[0]并且$Var2[1]{E}[0]都是对同一个哈希的引用
  • $Var2[0]{E}[1]并且$Var2[1]{E}[1]都是对同一个哈希的引用

在您的预期输出中,

  • $Var2[0]{E}并且$Var2[1]{E}是对不同数组的引用
  • $Var2[0]{E}[0]并且$Var2[1]{E}[0]是对不同哈希的引用
  • $Var2[0]{E}[1]并且$Var2[1]{E}[1]是对不同哈希的引用

你可以得到你想要使用的输出

local $Data::Dumper::Deepcopy = 1;

但如果这样做,您转储的数据结构将与您的实际数据结构不同。

于 2013-03-21T22:49:21.773 回答
1

http://perldoc.perl.org/Data/Dumper.html

Data::Dumper 将对转储值时遇到的所有引用进行编目。交叉引用(以 perl 语法中的子结构名称的形式)将插入所有可能的点,保留原始值集中的任何结构相互依赖性。结构遍历是深度优先的,并且按照从第一个提供的值到最后一个提供的值的顺序进行。

您可以禁用它:

$Data::Dumper::Deepcopy 或 $OBJ->Deepcopy([NEWVAL]) 可以设置为布尔值以启用结构的深层复制。只有在绝对必要时才会进行交叉引用(即打破引用循环)。默认值为 0。

于 2013-03-21T22:38:36.703 回答