2014-04-04 38 views
0

我查找过这个问题的答案,但没有找到答案;在此先感谢您的帮助。在哈希中访问数组时发生Perl问题

我想构建一个数组的散列,然后从散列中随机生成数组。散列是长度为3,并且每个阵列是一对值:

undef %pairs; 

$pairs{'one'} = @pair1; 
$pairs{'two'} = @pair2; 
$pairs{'three'} = @pair3; 

@keys = keys %pairs; 

@keys = shuffle(@keys); 

push (@file1, @{$pairs{$keys[0]}}); 
push (@file2, @{$pairs{$keys[1]}}); 
push (@file3, @{$pairs{$keys[2]}}); 

下面的调用不返回任何:

print STDOUT @{$pairs{$keys[0]}}; 

虽然下一个呼叫不正确地返回数组的长度(即2):

print STDOUT $pairs{$keys[0]}; 

我在做什么错在这里?

回答

5

您还没有分配数组,你分配它们的大小:

$pairs{'one'} = @pair1; 

如果在标量上下文中,数组返回它的大小,这是标量上下文。你想要么:

$pairs{'one'} = \@pair1;  # use direct reference 
$pairs{'one'} = [ @pair1 ]; # anonymous reference using copied values 

或可能

@{ $pairs{'one'} } = @pair1; 

而且,你不使用:

use strict; 
use warnings; 

或者你已经知道为什么这个代码失败:

print STDOUT @{$pairs{$keys[0]}}; 

因为你会收到f阿塔尔贝哈错误:

Can't use string ("2") as an ARRAY ref while "strict refs" in use 

因为你的散列值$pairs{$keys[0]}设为2(数组的大小)。

+1

+1:很好的解释。阅读您的答案@TLP是一种绝对的快乐。 –

+0

@JS웃谢谢,很高兴听到! – TLP