2010-11-24 53 views
1

我有這樣的:Perl的:獲取哈希陣列並行價值

my(%arr) = (
monsters => ["Test","Test2"], 
kills => [-1, -2  ]); 

再後來我搜索的Test2:

if (grep { $_ eq "Test2"} @{ $arr{monsters} }) 
{ 
    #Get parallel value of Test2 (-2) 
    next; 
} 

我怎樣才能獲得並列值,而不知道指數(實際變量用於搜索時,而不是字符串文字)?

回答

4

嘗試哈希散列:

my %arr = (
    'Test' => { 
    'kills' => -1, 
    }, 
    'Test2' => { 
    'kills' => -2, 
    }, 
); 

print $arr{'Test2'}{'kills'}, "\n"; 
+1

我將如何循環以打印它?沒關係,認爲我明白了:while(($ k,$ v)= each%arr) print「$ k =>」,$ arr {「$ k」} {「kill」},「\ n」 ; } – Zeno 2010-11-24 23:14:04

5

不是使用grep,只是環陣列上方,並保持一個計數變量:

for my $idx(0 .. $#{ $arr{monsters} }) { 
    if ($arr{monsters}[$idx] eq 'Test2') { 
     print "Kills = $arr{kills}[$idx]\n"; 
     last; 
    } 
} 

一個更好的辦法不過來處理這個,可能是重新考慮你的數據結構。相反平行排列的,考慮散列的數組:

my @monsters = ({ name => 'Test', kills => -1 }, { name => 'Test2', kills => -2 }); 

現在,要找到一個特定的怪物:

my ($monst) = grep { $_->{name} eq 'Test2' } @monsters; 
print $monst->{kills}; 

這將允許您按名稱搜索並殺死同樣容易。如果你打算總是按名稱搜索,那麼在名稱上鍵入一個哈希值並指向殺死數量(如@dmah所示)可能會更好。

一個更好的方式來處理,這將是要給你在怪物一類,並讓每個對象跟蹤它自己殺死的,但我會離開,作爲一個練習OP。