2013-03-21 45 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不同於你的實際數據結構。