#! /usr/bin/env perl
use strict;
use warnings;
# for demo only
*ARGV = *DATA;
my %record;
my @order;
while (<>) {
chomp;
my($key,$combine) = split;
push @order, $key unless exists $record{$key};
push @{ $record{$key} }, $combine;
}
print $_, "\t", join(";", @{ $record{$_} }), "\n" for @order;
__DATA__
a foo
a bar
a foo2
b bar
c bar2
Вывод (с табуляциями, преобразованными в пробелы, потому что переполнение стека прерывает вывод):
a foo;bar;foo2
b bar
c bar2