LINUX.ORG.RU

#!/usr/bin/perl -w
     
use strict;
     
my %tmp = (
    "key1" => 3,
    "key2" => 6,
    "key3" => 1,
    "key4" => 3,
);
     
my %sorted_by_values = ();
     
for my $key ( keys %tmp ) {
    my $value = $tmp{ $key };
     
    if ( exists $sorted_by_values{ $value } ) {
        push @{ $sorted_by_values{ $value } }, $key;
    } else {
        $sorted_by_values{ $value } = [ $key ];
    }
}
     
for my $value ( sort keys %sorted_by_values ) {
    for my $key ( sort @{ $sorted_by_values{ $value } } ) {
        printf "%s => %d\n", $key, $value;
    }
}

http://ideone.com/iyv87Z

gh0stwizard ★★★★★ ()
map {print "$_ $tmp{$_}\n"} sort {$tmp{$a} <=> $tmp{$b}} keys %tmp
disarmer ★★★ ()
my %tmp = (
  "key1" => 3,
  "key2" => 6,
  "key3" => 1,
);

print "$_\n" for sort { $tmp{$a} <=> $tmp{$b} } keys %tmp;
outtaspace ★★★ ()
Ответ на: комментарий от djnoob

Ребята дали более оптимальные варианты, объясню на них:

#!/usr/bin/perl -w

use strict;

my %tmp = (
  "key1" => 3,
  "key2" => 6,
  "key3" => 1,
  "key4" => 3,
);

# Это сортировка по убыванию
# По увеличению: заменить на $tmp{$a} <=> $tmp{$b}
for my $key ( sort { $tmp{$b} <=> $tmp{$a} } keys %tmp ) {
	printf "%s => %d\n", $key, $tmp{ $key };
}

http://ideone.com/TWqoXd

gh0stwizard ★★★★★ ()

<code> foreach (sort {$tmp{$a} <= $tmp{$b}} keys %tmp) { print «$_ ===».$tmp{$_}.«\n» } </code>

anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.