http://www.perlmonks.org?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