相同串連的散列值我有一個哈希 是這樣的:
當關鍵是在Perl
abc=>1
hello=>32
abc=>4
hello=>23
hello=>12
xyz=>18
我們如何可以連接的價值觀,它的鍵是一樣的。 所以輸出將是:
abc=>"1,4"
hello=>"23,12,32"
xyz=>"18".
我試圖通過排序的鍵,然後爲每個鍵檢查,如果他們是相同的,然後串聯值的哈希,但我沒有得到的是如何在兩個鍵比較同樣的循環。
在此先感謝。
相同串連的散列值我有一個哈希 是這樣的:
當關鍵是在Perl
abc=>1
hello=>32
abc=>4
hello=>23
hello=>12
xyz=>18
我們如何可以連接的價值觀,它的鍵是一樣的。 所以輸出將是:
abc=>"1,4"
hello=>"23,12,32"
xyz=>"18".
我試圖通過排序的鍵,然後爲每個鍵檢查,如果他們是相同的,然後串聯值的哈希,但我沒有得到的是如何在兩個鍵比較同樣的循環。
在此先感謝。
如果它與鍵值對的列表,你所談論的,那麼你可以這樣做:
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;
}
這個作品的確切方式取決於你的數據的真正來源,但這個方案顯示了一種方法從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
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";
}
由於目前還不清楚你真正努力去做,我猜,你有你需要修改一個文件。在這種情況下,單線可能是有序的。
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塊基本相同,它在輸入結束時執行以下代碼。
這看起來像一個鍵 - >值對,而不是一個散列,因爲散列總是隻有一個值與一個鍵相關聯。 –
你怎麼能有相同的密鑰哈希?你的意思是你有一個'key => value'對的數組嗎? – Qtax
Perl哈希不可能有兩個具有相同鍵的元素。請描述你的潛在問題。 – Borodin