2013-03-21 47 views
0

我有一个代码是这样的: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翻斗车,它是这样的:

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


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

为什么不在第二种情况下打印?虽然它打印在第一位?

+0

你能告诉我你是怎么称呼'Dumper'和'@ Var2'的? – 2013-03-21 22:37:29

+0

print Dumper @ Var2 – user2013387 2013-03-21 22:38:21

+0

当你打印Dumper \ @ Var2'时发生了什么? – 2013-03-21 22:38:46

回答

1

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

数据::自卸车将目录而倾倒值遇到的所有引用。交叉引用(以perl语法中子结构名称的形式)将插入所有可能的点,从而保留原始值集合中的任何结构相互依赖关系。结构遍历是深度优先的,并且按照从第一个提供的值到最后一个的顺序进行。

您可以禁用:

$数据::自卸车:: deepcopy的或$ OBJ-> deepcopy的([的newval]) 可设置一个布尔值,使结构的深层副本。然后只有在绝对必要时才可以进行交叉参考(即断开参考周期)。默认值为0。

+0

它已被禁用。 – ikegami 2013-03-21 22:51:03

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; 

但是,如果你这样做,你倾销的数据结构将是d不同于你的实际数据结构。