2013-08-19 73 views
0

我已經建立了包含數組的數組的哈希,讓我們叫它%hash_multidim,使得從數據輸出::自卸車看起來像這樣:如何訪問陣列數組的Perl哈希值?

 'Key1' => [ 
        [ 
        '-3.81', 
        '-1.91', 
        '-1.86', 
        '-1.70' 
        ], 
        [ 
        '1.35', 
        '1.04', 
        '-1.01', 
        '-2.69' 
        ] 
       ], 
     'Key2' => [ 
        [ 
         '-1.63' 
        ], 
        [ 
         '-1.17' 
        ] 
        ], 

現在,我想在訪問和執行操作在這個結構中最底層的水平。例如,對於'Key1',我想查找行1中的均值(又名[0]處數組的均值)。 使用列表::的Util QW(和),我編寫了一個子程序稱爲平均:

sub mean { 
    return sum(@_)/scalar(@_); 
} 

然而,如果使用子程序,如:

my $test = mean($hash_multidim{Key1}[0]); 
print $test; 

我沒有得到我的期望。事實上,我得到:

43678288 

我哪裏出錯了?如果我試圖評估結果

$hash_multidim{Key1}[0] 

一切都看起來很潔淨。例如,

@test2 = $hash_multidim{Key1}[0]; 
print Dumper(\@test2); 

產生這樣的輸出:

$VAR1 = [ 
      [ 
      '-3.81', 
      '-1.91', 
      '-1.86', 
      '-1.70' 
      ] 
     ]; 

回答

4

$hash_multidim{Key1}[0]是陣列參考,但mean期望列表。所以你只需要「解除」它。語法是有點複雜,但它是

my $test = mean(@{$hash_multidim{Key1}[0]}); 
+0

謝謝!我的直覺是這是一個取消引用的問題,但是當我試圖修復它時,我弄糟了語法。取消引用多維數據結構的一部分時,我傾向於恐慌。任何提示(除了經驗)或啓發式知道如何/何時取消引用?實際上,我確信我已經知道了什麼時候,但是如何(對於複雜的情況)經常讓我在閱讀完perldoc之後感到困惑。 – MCor

+0

如果您的表達式以'$'開始,那麼您始終有一個標量(可能是對數組或散列的引用)。如果它以'@'或'%'開頭,那麼它是一個數組或散列。 – mob

3

$hash_multidim{Key1}[0]是標,它的值是數組的引用。當您要傳遞參考數組元素的值時,您將該單個標量傳遞給mean

my $test = mean(@{ $hash_multidim{Key1}[0] }); 


注:除法運算符不能用列表劃分,只有一個數字。因此,它在其操作數上施加了一個標量上下文。您使用scalar是多餘的。你可以簡單地使用

sub mean { sum(@_)/@_ } 
+0

感謝您的提示:按名單劃分!我認爲我可以用自己的方式編寫它,但是我並不總是用Perl編程,我喜歡爲自己寫清楚(所以我稍後回到代碼時不會驚慌)。 – MCor