2010-03-25 33 views
0

編輯對不起,我忘了這裏最重要的部分。每個鍵可以有有多個值。向那些已經回答的人道歉。稍後將使用printjoin在單行上打印$key的多個值。如何將唯一值添加到用作散列值的匿名數組?

在下面的示例代碼中,假設值$keyvalue不斷變化,我嘗試使用一行(或類似的東西)來測試並查看當前的$keyvalue是否已經存在。如果是這樣,那就什麼都不要做。如果沒有,然後推它。這條線將駐留在while語句中,這就是爲什麼它需要包含在幾行內。

只要沒有重複的值,保留順序並不重要。

my $key = "numbers"; 
my $keyvalue = 1; 

my %hash = ($key => '1'); 

push (@{$hash{$key}}, $keyvalue) unless exists $hash{$key}; 

我沒有得到任何錯誤與use strict; use warnings;,但在同一時間,這是行不通的。在上面的例子中,我預計,因爲默認值是1$keyvalue不會被推,因爲它也是1。也許我已經得到了自己所有的轉身...

是否有調整,讓這個工作或任何替代品可以用來完成相同的事情?

+2

爲什麼與'push'打擾如果你只曾經打算保存單個值?只需存儲該值。如果您已有,則跳過存儲。 – 2010-03-25 10:39:50

回答

5

最簡單的方法是將匿名散列放在$hash{$key}處。你只關心那個匿名散列的關鍵字。

#!/usr/bin/perl 

use strict; use warnings; 

my %hash; 

while (my $line = <DATA>) { 
    chomp $line; 
    my ($key, $val) = split /\s*=\s*/, $line; 
    $hash{$key}{$val} = undef; 
} 

for my $key (keys %hash) { 
    printf "%s : [ %s ]\n", $key, join(' ', keys %{ $hash{$key} }); 
} 

__DATA__ 
key = 1 
key = 2 
other = 1 
other = 2 
key = 2 
key = 3 

在輸出中,key = 2只出現一次:

C:\Temp> h 
other : [ 1 2 ] 
key : [ 1 3 2 ]
3

你可以這樣做:

$hash{$key} = $keyvalue unless exists $hash{$key}; 

這將增加鍵,值對($key,$keyvalue)只有關鍵是不存在的哈希值。

0

您不需要push值成爲一個散列,因爲散列需要鍵/值對,推只會添加一個值。在您的表達式中,您將$hash{$key}視爲您要添加值的數組引用。您只需通常將值分配給散列。