2012-06-05 48 views
2

相同串連的散列值我有一個哈希 是這樣的:
當關鍵是在Perl

abc=>1 
hello=>32 
abc=>4 
hello=>23 
hello=>12 
xyz=>18 

我們如何可以連接的價值觀,它的鍵是一樣的。 所以輸出將是:

abc=>"1,4" 
hello=>"23,12,32" 
xyz=>"18". 

我試圖通過排序的鍵,然後爲每個鍵檢查,如果他們是相同的,然後串聯值的哈希,但我沒有得到的是如何在兩個鍵比較同樣的循環。

在此先感謝。

+3

這看起來像一個鍵 - >值對,而不是一個散列,因爲散列總是隻有一個值與一個鍵相關聯。 –

+0

你怎麼能有相同的密鑰哈希?你的意思是你有一個'key => value'對的數組嗎? – Qtax

+4

Perl哈希不可能有兩個具有相同鍵的元素。請描述你的潛在問題。 – Borodin

回答

3

如果它與鍵值對的列表,你所談論的,那麼你可以這樣做:

my @kv = (
    abc=>1, 
    hello=>32, 
    abc=>4, 
    hello=>23, 
    hello=>12, 
    xyz=>18, 
); 

my %hash; 

while(@kv){ 
    my $k = shift @kv; 
    my $v = shift @kv; 

    $hash{$k} = defined $hash{$k} ? "$hash{$k},$v" : $v; 
} 
7

這個作品的確切方式取決於你的數據的真正來源,但這個方案顯示了一種方法從DATA文件句柄讀取信息以構建並轉儲散列。

散列的值是匿名數組,其中包含對應於相同鍵的所有值。

use strict; 
use warnings; 

my %data; 

while (<DATA>) { 
    my ($k, $v) = /\w+/g; 
    push @{ $data{$k} }, $v; 
} 

for my $k (sort keys %data) { 
    printf "%s => %s\n", $k, join ',', @{ $data{$k} }; 
} 

__DATA__ 
abc=>1 
hello=>32 
abc=>4 
hello=>23 
hello=>12 
xyz=>18 

輸出

abc => 1,4 
hello => 32,23,12 
xyz => 18 
+0

+1,不知道你可以推到未定義的參考。 – Qtax

+1

http://en.wikipedia.org/wiki/Autovivification –

+0

謝謝@Borodin,這種方法對我有用 – rahul

1
my @pairs = (
    abc=>1, 
    hello=>32, 
    abc=>4, 
    hello=>23, 
    hello=>12, 
    xyz=>18, 
); 

my %hash; 

# collect 
for(my $idx = 0; $idx < scalar @pairs; $idx += 2){ 
    my $key = $pairs[$idx]; 
    my $val = $pairs[$idx+1]; 
    push @{ $hash{$key} }, $val; 
} 

# print combined 
while(my ($key, $val) = each %hash){ 
    print "$key = ", join(',', @$val), "\n"; 
} 
0

由於目前還不清楚你真正努力去做,我猜,你有你需要修改一個文件。在這種情況下,單線可能是有序的。

perl -lwne ' 
    ($k,$v) = split /=>/; 
    $data{$k} = join ",", $data{$k} //(), $v }{ 
    print "$_=>$data{$_}" for keys %data' input.txt > output.txt 

輸出:

hello=>32,23,12 
abc=>1,4 
xyz=>18 

注意,在輸出密鑰不會以相同的順序作爲輸入。如果你喜歡,你可以對鍵進行分類,但我選擇不要。

說明:

  • -l將刪除行尾一邊讀書,並把他們的背部,同時打印
  • -n將會把計劃圍繞while(<>)循環,讀取文件(或標準輸入)一行一行。
  • //defined-or operator。如果LHS未定義,它將返回RHS。
  • }{eskimo kiss operator只適用於-n選項。它所做的與END塊基本相同,它在輸入結束時執行以下代碼。
+0

嗨TLP, 我試着運行這段代碼,但是這樣會產生如下錯誤: 找到字符串,打印「$ _ => $ Rhash {$ _}」爲鍵%Rhash'' (可能是一條從第90行開始的失控多行''字符串) (在上一行缺少分號?) 標量找到的位置預計在'print'$ _ => $ Rhash {$ _}「附近獲得關鍵字%Rhash''。我試圖糾正它,但不能,因爲我不太熟悉Perl的單行程。如果你認爲我犯了一些錯誤,或者你知道這個錯誤,請告訴我。在此先感謝 – rahul

+0

@rahul這是什麼,我聽到有關線90?你把它粘貼到其他程序文件或其他東西? – TLP