2013-03-08 29 views
1

在以下代码中,当打印数组的内容时,hash3的key3没有所需的值(我想要实现的是hashref1在key3中有一个数组, hashref2在key3中拥有value2的数组)。在多重散列中使用的阵列参数的元素未显示

在代码流中,我需要首先填充hashrefs,然后将数据推送到子数组。

如果使用引用子数组是正确的方式去这里,你可以请指教吗?

#!/usr/bin/perl 
use strict; 
use warnings; 
use Data::Dumper; 

my @array; 
my @subarray; 


# Puash to array 
my $hashref1 = { 
    key1 => 'value1_1', 
    key2 => 'value1_2', 
    key3 => \@subarray 
}; 
push (@array, $hashref1); 

# push some data in subarray 
push (@subarray, 'value1'); 

# clear subarray 
splice(@subarray); 

# Puash to array 
my $hashref2 = { 
    key1 => 'value2_1', 
    key2 => 'value2_2', 
    key3 => \@subarray 
}; 
push (@array, $hashref2); 

# push some data in subarray 
push (@subarray, 'value2'); 

print "hashref1:\n".Dumper($hashref1); 
print "hashref2:\n".Dumper($hashref2); 

print "array:\n".Dumper(@array); 

出来:

hashref1: 
$VAR1 = { 
      'key2' => 'value1_2', 
      'key1' => 'value1_1', 
      'key3' => [ 
         'value2' 
        ] 
     }; 
hashref2: 
$VAR1 = { 
      'key2' => 'value2_2', 
      'key1' => 'value2_1', 
      'key3' => [ 
         'value2' 
        ] 
     }; 
array: 
$VAR1 = { 
      'key2' => 'value1_2', 
      'key1' => 'value1_1', 
      'key3' => [ 
         'value2' 
        ] 
     }; 
$VAR2 = { 
      'key2' => 'value2_2', 
      'key1' => 'value2_1', 
      'key3' => $VAR1->{'key3'} 
     }; 
+0

顺便说一句,'自卸车(@array)'应该是'自卸车(\ @阵列)'。将数组或哈希传递给'Dumper'是没有意义的。 – ikegami 2013-03-08 17:42:29

回答

2

我猜你只是不完全理解引用是如何工作的。你基本上是在推动对同一个数组的引用,所以你难怪你有这个数组完全相同的内容。

你需要做的是创建一个新的数组引用。下面是正确的代码:

#!/usr/bin/perl 
use strict; 
use warnings; 
use Data::Dumper; 

my @array; 
my $subarray = []; 


# Puash to array 
my $hashref1 = { 
    key1 => 'value1_1', 
    key2 => 'value1_2', 
    key3 => $subarray 
}; 
push (@array, $hashref1); 

# push some data in subarray 
push (@$subarray, 'value1'); 

# create a new subarray 
$subarray = []; 

# Puash to array 
my $hashref2 = { 
    key1 => 'value2_1', 
    key2 => 'value2_2', 
    key3 => $subarray 
}; 
push (@array, $hashref2); 

# push some data in subarray 
push (@$subarray, 'value2'); 

print "hashref1:\n".Dumper($hashref1); 
print "hashref2:\n".Dumper($hashref2); 

print "array:\n".Dumper(@array); 
4

您存储所有的散列引用到相同数组引用。这意味着如果您修改@subarray,所有引用它的哈希似乎都会一致地改变。

而是使独立的浅拷贝作为

@subarray = ('value2'); 
my $hashref2 = { 
    key1 => 'value2_1', 
    key2 => 'value2_2', 
    key3 => [ @subarray ], 
}; 
push (@array, $hashref2);