http://qs321.pair.com?node_id=729238

haoess has asked for the wisdom of the Perl Monks concerning the following question:

Like in Perl 5 you can print your hash sorted by its values:

```my %nums = (
four  => 4,
one   => 1,
three => 3,
two   => 2,
);

for %nums.keys.sort: { %nums{\$^a} <=> %nums{\$^b} } -> \$key {
say "\$key {%nums{\$key}}";
}
Output (it works with my latest Rakudo checkout):
```one 1
two 2
three 3
four 4

Maybe there's a more comfortable (aka shorter) way to get this, without writing %nums three times on the same line?

Thanks, Frank

Replies are listed 'Best First'.
Re: [Perl6] Sort a hash by value
by moritz (Cardinal) on Dec 09, 2008 at 19:13 UTC
```my %nums = (
four  => 4,
one   => 1,
three => 3,
two   => 2,
);

for %nums.pairs.sort: { \$^a.value <=> \$^b.value } -> \$pair {
say \$pair;
}

(not necessarily shorter, but mentions %nums only once in the sort line).

There was also a proposal to make the sort method accept a block of arity one that automatically performs a ST, but it doesn't seem to be in the spec, and thusly isn't implemented by Rakudo right now.

Update: clinton asked in the CB what the colon after the sort was about, so here's the explanation for everybody: The are two syntax forms for method calls in Perl 6, \$object.method(\$arg1, \$arg2, ...) and \$object.method: \$arg1, \$args, .... My example uses the latter to avoid more parenthesis.

There was also a proposal to make the sort method accept a block of arity one that automatically performs a ST, but it doesn't seem to be in the spec, and thusly isn't implemented by Rakudo right now.

Thanks to pmichaud++, now it is (he says).

Update: Here's his blog entry.

-- Frank