Вот еще одна довольно короткая, ясная версия:
while (<>) {
if(/^Chr\S+/) {
$c=$&;
} else {
/\S+/;
push @{ $p{$c} }, $&;
}
}
И для печати результатов:
foreach my $pc ( sort keys %p ) {
print "$pc => ".join(", ", @{$p{$pc}})."\n";
}
Это более короткие результаты печати (но первый кажется болеедля чтения):
map { print "$_ => ".join(", ", @{$p{$_}})."\n" } sort keys %p;
Однострочная из командной строки:
perl <1 -e 'while(<>){ if(/^Chr\S+/){ $c=$&; }else{ /\S+/; push(@{$p{$c}},$&);} } map { print "$_ => ".join(", ", @{$p{$_}})."\n" } sort keys %p;'