2014-04-01 141 views
1

Perl中的哈希我做了相同的哈希是這樣的:與陣列

my %tags_hash; 

然後我重複了一些地圖和增加價值爲@tags_hash:

if (@tagslist) { 

     for (my $i = 0; $i <= $#tagslist; $i++) { 
      my %tag = %{$tagslist[$i]}; 


      $tags_hash{$tag{'refid'}} = $tag{'name'}; 


     }} 

但我想有有陣列,所以當密鑰存在時,然後將值添加到數組。 類似這樣的:

例如迭代

1, 
key = 1 
value = "good" 

{1:['good']} 


2, 
key = 1 
value = "bad" 

{1:['good', 'bad']} 

3, 
key = 2 
value = "bad" 

{1:['good', 'bad'], 2:['bad']} 

然後我想從鑰匙獲得數組:

print $tags_hash{'1'}; 

Returns: ['good', 'bad'] 

回答

2

一個擴展的例子:

#!/usr/bin/perl 

use strict; 
use warnings; 

my $hash = {}; # hash ref 

#populate hash 
push @{ $hash->{1} }, 'good'; 
push @{ $hash->{1} }, 'bad'; 
push @{ $hash->{2} }, 'bad'; 

my @keys = keys %{ $hash }; # get hash keys 

foreach my $key (@keys) { # crawl through hash 
    print "$key: "; 
    my @list = @{$hash->{$key}}; # get list associate within this key 
    foreach my $item (@list) { # iterate through items 
    print "$item "; 
    } 
    print "\n"; 
} 

輸出:

1: good bad 
2: bad 
+1

+1:雖然在過去的7個系可以說'打印 「$ _:」 被簡化。加入(「」,@ {$ hash - > {$ _}})。「\ n」foreach(鍵%$ hash);' –

+0

@jaypal好主意,但我認爲輸出可能有點複雜我對它的建議。實際上所需的輸出格式爲:'{1:['good','bad'],2:['bad']}'所以這個表單有點棘手。 –

1

所以散列元素的值是一個數組引用。一旦你有了,你需要做的就是把值推到數組上。

$hash{$key} //= []; 
push @{ $hash{$key} }, $val; 

或以下類型:

push @{ $hash{$key} //= [] }, $val; 

或者,由於自動激活,只需執行以下操作:

push @{ $hash{$key} }, $val; 

例如,

for (
    [ 1, 'good' ], 
    [ 1, 'bad' ], 
    [ 2, 'bad' ], 
) { 
    my ($key, $val) = @$_; 
    push @{ $hash{$key} }, $val; 
}