Как сказал Брайан, используйте хеш-таблицу. Следующее удаляет переводы строк, разделяет каждую запись на запятые, использует исходную форму «фамилия, имя» в качестве ключа к хешу, помещает оставшиеся значения в массив и использует ссылку на указанный массив в качестве значения для указанного выше ключа. .
Затем он просто перебирает пары ключ / значение в хэше и соответственно форматирует.
Исправленное решение - сортировка чисел, пропуск средних имен и вывод сортировки
#!/usr/bin/env perl
use strict;
use warnings;
my %merged;
while (my $record = <DATA>) {
chomp $record;
my ($lname, $fname, @stuff) = split /[, ]+/, $record;
push @{ $merged{"$lname, $fname"} }, grep { m/^\d+$/; } @stuff;
}
foreach my $name (sort keys %merged) {
print $name, ", ", join( ', ', sort { $a <=> $b } @{$merged{$name}}), "\n";
}
__DATA__
Nowosielski, Matthew, 484, 584, 777
Nowosielski, Matthew, 1151
Nunes, Paulino, 116
Nussbaum, Mike, 1221, 444,
Nussbaum, Mike, 156
Nowosielski, Matthew, Kimball, 485, 684, 277
Исправленный вывод
Nowosielski, Matthew, 277, 484, 485, 584, 684, 777, 1151
Nunes, Paulino, 116
Nussbaum, Mike, 156, 444, 1221
Оригинальное решение
#!/usr/bin/env perl
use strict;
use warnings;
my %merged;
while (my $record = <DATA>) {
chomp $record;
my ($lname, $fname, @stuff) = split /,/, $record;
push @{ $merged{"$lname, $fname"} }, @stuff;
}
while (my ($name, $stuff) = each %merged) {
print $name, join( ',', @$stuff), "\n";
}
__DATA__
Nowosielski, Matthew, 484, 584, 777
Nowosielski, Matthew, 1151
Nunes, Paulino, 116
Nussbaum, Mike, 1221, 444,
Nussbaum, Mike, 156