in reply to Custom, Reusable Sort Subroutine for Hashes?

```#!/usr/bin/perl
use warnings;
use strict;
use feature qw{ say };

sub sort_hash (&\%) {
my (\$sub, \$hash) = @_;
sort {
local(\$a, \$b) = @\$hash{\$a, \$b};
\$sub->()
} keys %\$hash
}

my %hash = ( second => 2, fourth => 4, third => 3, first => 1 );
say for sort_hash { \$a <=> \$b } %hash;

I used a prototype to make the syntax of sort_hash similar to that of sort. The trick is replacing the magical variables \$a and \$b with the respective values from the hash.

```(\$q=q:Sq=~/;[c](.)(.)/;chr(-||-|5+lengthSq)`"S|oS2"`map{chr |+ord
}map{substrSq`S_+|`|}3E|-|`7**2-3:)=~y+S|`+\$1,++print+eval\$q,q,a,

Replies are listed 'Best First'.
Re^2: Custom, Reusable Sort Subroutine for Hashes?
by QM (Parson) on Aug 30, 2017 at 12:45 UTC
This is very good, thanks.

Just as an extension, can I use this with a named sort sub? I expect so, but I'll have to go off and experiment.

-QM
--
Quantum Mechanics: The dreams stuff is made of

> can I use this with a named sort sub?

Sure, but you can't use the nice syntax anymore:

```sub numerically { \$a <=> \$b }
say for sort_hash(\&numerically, %hash);
```(\$q=q:Sq=~/;[c](.)(.)/;chr(-||-|5+lengthSq)`"S|oS2"`map{chr |+ord
}map{substrSq`S_+|`|}3E|-|`7**2-3:)=~y+S|`+\$1,++print+eval\$q,q,a,
> but you can't use the nice syntax anymore:

> say for sort_hash(\&numerically, %hash);

well you don't need the braces

say for sort_hash \&numerically, %hash ;

and this works too

say for sort_hash {numerically} %hash ;

Cheers Rolf
(addicted to the Perl Programming Language and ☆☆☆☆ :)
Je suis Charlie!