2014-04-04 65 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