Вы уверены, что хотите снова ввести строку cols
в значения?Если нет, попробуйте это:
my %myhash;
$line1 = "col1 0.999";
$line2 = "col2 0.899";
$line3 = "col2 -0.52";
$line4 = "col2 1.52";
#insert into hash
@cols = split(" ", $line1);
push @{ $myhash{$cols[0]} }, $cols[1];
@cols = split(" ", $line2);
push @{ $myhash{$cols[0]} }, $cols[1];
@cols = split(" ", $line3);
push @{ $myhash{$cols[0]} }, $cols[1];
@cols = split(" ", $line4);
push @{ $myhash{$cols[0]} }, $cols[1];
foreach $k (sort {$a <=> $b} (keys %myhash)) {
foreach $v(sort {$a <=> $b}(@{$myhash{$k}}))
{
print $k." : $v \n";
}
}
Иначе, напишите функцию сортировки для второго foreach, чтобы игнорировать слово 'cols', и используйте только второе слово для сортировки.
Редактировать:
Ну, я хотел уклониться от написания этого сам, но так как вы спросили;) это объясняет суть:
foreach $k (sort {$a <=> $b} (keys %myhash)) {
foreach $v(sort mysorter (@{$myhash{$k}})) #mysorter is a sub, defined further on
{
print $k." : $v \n";
}
}
sub mysorter {
my $c = $a;
my $d = $b;
$c =~ s/(.*) (.*)/\2/gi;
$d =~ s/(.*) (.*)/\2/gi;
return $c <=> $d;
}