Perl打印阵列

时间:2013-03-21 22:31:15

标签: perl

我有一个像这样的代码:

@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'}
    };

为什么这不是在第二种情况下打印。虽然它打印在第一个位置?

2 个答案:

答案 0 :(得分:1)

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

  

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

你可以禁用它:

  

$ Data :: Dumper :: Deepcopy或$ OBJ-> Deepcopy([NEWVAL])   可以设置为布尔值以启用结构的深层副本。然后仅在绝对必要时(即,打破参考周期)才进行交叉引用。默认值为0.

答案 1 :(得分: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;

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