my @val = split(" ",$val); my $v = join (":", @val); #### my $v = join ':', split ' ', $val; #### if (exists $hash{$key}) { $hash{$key} .= $sep.$v; } else { $hash{$key} = $v; } #### $hash{$key} = exists $hash{$key} ? $hash{$key} . $sep . $v : $v; #### $hash{$key} = exists $hash{$key} ? "$hash{$key}$sep$v" : $v; #### #!/usr/bin/env perl -l use strict; use warnings; my %data; my $re = qr{^(\w+\s+\w+)\s+(\w+)\s+(\w+)}; while () { my ($key, $val) = map { $_->[0], join ':', @$_[1,2] } [/$re/]; push @{$data{$key}}, $val; } print "$_ ", join ', ', @{$data{$_}} for sort keys %data; __DATA__ id1 name1 cat1 catname1 id1 name1 cat2 catname2 id2 name2 cat3 catname3 id3 name3 cat1 catname1 id3 name3 cat4 catname4 #### id1 name1 cat1:catname1, cat2:catname2 id2 name2 cat3:catname3 id3 name3 cat1:catname1, cat4:catname4