2

I have a hash something like :

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

how can we concatenate the values, whose keys are same. So the output will be:

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

I tried by sorting the hash by keys then checking for each key, if they are same then concatenate the value, but i am not getting that how to compare two keys in same loop.

Thanks in advance.

4

4 に答える 4

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
于 2012-06-05T15:22:40.357 に答える
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;
}
于 2012-06-05T15:21:46.373 に答える
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";
}
于 2012-06-05T15:25:43.107 に答える
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(<>)、ファイル (または STDIN) を 1 行ずつ読み取ります。
  • //defined-or演算子です。LHS が未定義の場合、RHS を返します。
  • }{オプションでのみ動作するエスキモーキス オペレーターです。-n基本的には END ブロックと同じで、入力の最後に次のコードを実行します。
于 2012-06-05T18:23:29.173 に答える