2012-09-21 59 views
14

我是相當新的Perl,所以請原諒我,如果這看起來像一個簡單的問題...Perl如何從數組散列中檢索數組?

無論如何,我有一個數組散列,我試圖檢索哈希中的數組之一,但我能得到的只是數組的標量大小。

%HoA = a hash of arrays 
$key = some key in the hash 

foreach $nextItem (@HoA{$key}) { 
    do a bunch of stuff with $nextItem 
} 

當我這樣做時,$ nextItem總是隻是數組的大小,循環只能運行一次。我試着打印以下:

@HoA{$key} 
$HoA{$key} 
@$HoA{$key} 

前兩個給我標量的大小和第三給我什麼......我缺少什麼嗎?

更新:我想知道如果我的問題實際上是我將數組添加到哈希的方式。下面是我在做什麼:

@HoA{$key} = split(/ /, $list); 

這是否堅持在哈希數組,或者散列數組的大小?

更新2:我嘗試下面的代碼塊:

my $key = "TEST"; 
my %HoA =(); 
my @testarray = (1, 2, 3); 
@HoA{$key} = @testarray; 
print Dumper(%HoA); 

這裏的輸出:

$VAR1 = 'TEST'; 
$VAR2 = 1; 

爲什麼僅粘附陣列的所述第一值中?

回答

13

嘗試引用您的數組是這樣的:

%HoA = a hash of arrays 
$key = some key in the hash 

foreach $nextItem (@{$HoA{$key}}) { 
    do a bunch of stuff with $nextItem 
} 

您在$HoA{$key}拿數組引用,並使其成爲一個數組。

編輯:爲了您的更新,我想你會得到你想要的東西,如果你這樣做是這樣的:

@{$HoA{$key}} = split(/ /, $list); 

,或者你可以做

push(@{$HoA{$key}}, split(/ /, $list); 

例如:

my $list = "fred joe brown sam"; 
my %HoA =(); 
my $key = "jacob"; 
@{$HoA{$key} = split(/ /, $list); 
foreach my $item (@{$HoA{$key}}) 
{ 
    print "Test item: $nextItem\n"; 
} 

You will get: 
Test item: fred 
Test item: joe 
Test item: brown 
Test item: sam 

編輯: 將use strict;添加到您的程序的頂部。基本上,當你有一個哈希定義時,你試圖使用HoA作爲數組。您正在不正確地引用散列的內容。要做到這一點,你真的需要在@HoA之間有$。 Perl是無類型的,如果你不是use strict;,它會讓你逃脫謀殺。 A reference excerpt from oreilly可能會清除一些東西。

my @testarray是一個數組
my %hash是散列
$hash{$el1} = \@array是具有ref的值到一個數組
@{$hash{$el1}} = @array散列元件被包含數組的散列元件

+0

我想:當你從取消引用哈希檢索

$HoA{$key} = \@testarray; 

然後。它只是返回一個大小爲零的循環,甚至不會執行一次。 – mrplainswalker

+0

@mrplainswalker - 嘗試打印出散列的內容並確保它具有您認爲它具有的結構。也許你的關鍵是未定義或不像你想象的數組。你可以使用Data :: Dumper;自卸車(%HoA)檢查出來。你也可以做if(定義($ HoA {$ key})){print「Defined」}作爲一個快速測試 – scrappedcola

+0

好吧,我嘗試了Dumper函數來查看哈希中的內容,並且你是對的。 ..這不是我所期望的。每個值只是數組中的第一項,而不是整個數組。 – mrplainswalker

2
@array 

你是如何得到陣列的,所以

@{ $array_ref } 

與數組引用等效。

$HoA{$key} 

是一個數組的引用,所以

@{ $HoA{$key} } 

是數組。

for my $nextItem (@{ $HoA{$key} }) 
6

在散列中的每個條目是一個參考到陣列。例如:

$my_hash{$key} 

參考到一個數組,而不是陣列。 $my_hash{$key}只是指向陣列所在的內存區域。取消對它的引用,你把數組符號在前面:

@{ my_hash{$key} } 

事情變得有點多毛,當我們開始談論內容:

${ my_hash{$key} }[0] 

是數組的第一個元素。你可以想象如果這個數組包含其他數組的哈希值,那麼這個語法就會變得非常複雜。幸運的是,Perl有把它處理乾淨方式:

$my_hash{$key}->[0]; 

這正是上面一樣,但更容易理解的語法。有時,它更容易使用的中間變量,所以您可以參考的東西,不用所有非關聯化:

my %hash_of_array_refs; 

foreach my $key (sort keys %hash_of_array_refs) { 
    my @array = @{ $hash_of_array_refs{$key} }; #Dereference 
    foreach my $element (@array) {     #Much easier to read and understand 
     say "First element is $array[0]"; 
     say "last element is $array[$#array]"; 
     say "This element: $element"; 
    } 
} 

沒有提領你會得到這樣的:

my %hash_of_array_refs; 

foreach my $key (sort keys %hash_of_array_refs) { 
    foreach my $element (@{ $hash_of_array_refs{$key} }) {     #Much easier to read and understand 
     say "First element is " . $hash_of_array_refs->[0]; 
     say "last element is " . $hash_of_array_refs->[$#{ $hash_of_array_refs{key} } ]"; 
     say "This element: $element"; 
    } 
} 
+0

+1〜謝謝!我查看了幾篇文章,並且您是第一位解釋如何使用$ myhash {$ key} - > [0]訪問數組散列內的元素的人。 –

0

「爲什麼只堅持的第一個值數組在?「

你需要把一個引用您的數組的哈希通過前面加上一個反斜線它:

@testarray = @{ $HoA{$key} }; 
+0

是的,但在其他答案中沒有指出這一點?我不清楚你的答案在這裏添加了什麼。 –

+0

其他答案假定他已經有散列中的引用,並沒有解決嘗試將數組放入散列而沒有引用的問題。其他答案已經被編輯。 – RobEarl