NAME

Sort::HashKeys - Get a sorted-by-key list from a hash

=head1 SYNOPSIS

use Sort::HashKeys;

my %hash;

@sorted_1 = map { ($_, $hash{$_}) } sort keys %hash;
@sorted_2 = Sort::HashKeys::sort(%hash);
# Same outcome, but the second is faster

DESCRIPTION

[13:37:51]  <a3f>	Is there a better way to get a sorted list out of a hash than map { ($_, $versions{$_}) } reverse sort keys @versions or iterating manually?
[13:39:06]  <a3f>	oh I could provide a compare function to sort and chunk the list two by two..
[13:40:15]  <haarg>	i'd probably go with the map{} reverse sort keys
[13:41:04]  <a3f>	I don't like it that it repeats the lookup for all keys. Of course wouldn't matter in practice but still…
[13:43:40]  <haarg>	whatever other solution you find will be slower

BENCHMARK

See C<benchmark.pl> in this distribution. Each test was run on a Haswell 2.6 GHz i5 CPU (4278U) for a minute on a copy of a randomly generated hash of 1000 keys. Keys were alphanumeric with length between 1 and 6 and values of integers between 1 and 1000.

                                     Rate
map {($_,$h{$_})} sort keys %h     1830/s        --      -27%
Sort::HashKeys::sort(%h)           2503/s       37%        --

37% faster.

One could do better by operating in-place, instead of copying off the pointers, but I'll leave that for another time. (or leave it to you! Send me your patch!)

METHODS AND ARGUMENTS

sort(@)

Sorts a hash-like list ((key1 => val1, key2 => val2>) by means of your libc's http://en.cppreference.com/w/c/string/byte/strcmp in ascending order. If an odd number of elements was passed in, an undef is appended.

Providing a sort function not yet supported.

reverse_sort(@)

Sorts in descending order.

GIT REPOSITORY

http://github.com/athreef/Sort-HashKeys

AUTHOR

Ahmad Fatoum <athreef@cpan.org>, http://a3f.at

COPYRIGHT AND LICENSE

Copyright (C) 2017 Ahmad Fatoum

This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.