sub keysort (&@) { my ($keygen, @values) = @_; my @keys = map { &$keygen() } @values; my @ix = sort { $keys[$a] cmp $keys[$b] } 0..$#keys; @values[@ix]; }