in reply to Hash ordering

The statement
    %key = sort keys %key;
takes the keys (not the associated values) of the hash, uselessly sort-s them (because hash key/value pairs have no inherent order beyond their key/value pairing) and assigns the (pseudo)randomly ordered keys only back to the hash. Please see the discussions of keys, values and each in the Perl documentation, and also associative arrays (hashes).

c:\@Work\Perl\monks>perl -wMstrict -le "my %alphas = ('a' .. 'x'); print qq{@{[ %alphas ]}}; ;; %alphas = sort keys %alphas; print qq{@{[ %alphas ]}}; " w x e f a b m n s t u v c d k l q r g h i j o p e g a c m o u w q s i k


Give a man a fish:  <%-{-{-{-<

Replies are listed 'Best First'.
Re^2: Hash ordering
by davido (Cardinal) on Apr 14, 2020 at 22:07 UTC

    One nuance that AnomalousMonk is aware of but I wanted to clarify:

    %key = sort keys %key;

    Let's say you start with a hash that looks like this:

    %key = ( foo => 'bar', bazz => 'bump', ping => 'pong', putt => 'pop', );

    The line of code above would capture only the keys (as was mentioned) and would save them only into the hash, so after running that line you would have this:

    %key = ( foo => 'bazz', ping => 'putt', );

    This is because the output of keys will just be foo, bazz, ping, putt, and when you take a flat list like that and store it into a hash, it is interpreted as key/value pairs. So your new hash loses all the values, and makes value out of half of the keys. If there are an odd number of keys, one of the new keys gets undef as its value, too.

    If we were to break the assignment down to steps it would look more like this:

    %key = ( foo => 'bar', bazz => 'bump', ping => 'pong', putt => 'pop', ); my @keys = keys %key; # foo, bazz, ping, putt %key = @keys; foo => bazz, ping => putt

    The sorting, itself is irrelevant because storing things in a hash loses any concept of order.


    Dave