FAQ 4.52 How do I sort an array by (anything)?

Do you have a question? Post it now! No Registration Necessary.  Now with pictures!

This is an excerpt from the latest version perlfaq4.pod, which
comes with the standard Perl distribution. These postings aim to
reduce the number of repeated questions as well as allow the community
to review and update the answers. The latest version of the complete
perlfaq is at http://faq.perl.org .


4.52: How do I sort an array by (anything)?

    Supply a comparison function to sort() (described in "sort" in

            @list = sort { $a <=> $b } @list;

    The default sort function is cmp, string comparison, which would sort
    "(1, 2, 10)" into "(1, 10, 2)". "<=>", used above, is the numerical
    comparison operator.

    If you have a complicated function needed to pull out the part you want
    to sort on, then don't do it inside the sort function. Pull it out
    first, because the sort BLOCK can be called many times for the same
    element. Here's an example of how to pull out the first word after the
    first number on each item, and then sort those words case-insensitively.

            @idx = ();
            for (@data) {
                    ($item) = /\d+\s*(\S+)/;
                    push @idx, uc($item);
            @sorted = @data[ sort { $idx[$a] cmp $idx[$b] } 0 .. $#idx ];

    which could also be written this way, using a trick that's come to be
    known as the Schwartzian Transform:

            @sorted = map  { $_->[0] }
                    sort { $a->[1] cmp $b->[1] }
                    map  { [ $_, uc( (/\d+\s*(\S+)/)[0]) ] } @data;

    If you need to sort on several fields, the following paradigm is useful.

            @sorted = sort {
                    field1($a) <=> field1($b) ||
                    field2($a) cmp field2($b) ||
                    field3($a) cmp field3($b)
                    } @data;

    This can be conveniently combined with precalculation of keys as given

    See the sort article in the "Far More Than You Ever Wanted To Know"
    collection in http://www.cpan.org/misc/olddoc/FMTEYEWTK.tgz for more
    about this approach.

    See also the question later in perlfaq4 on sorting hashes.


The perlfaq-workers, a group of volunteers, maintain the perlfaq. They
are not necessarily experts in every domain where Perl might show up,
so please include as much information as possible and relevant in any
corrections. The perlfaq-workers also don't have access to every
operating system or platform, so please include relevant details for
corrections to examples that do not work on particular platforms.
Working code is greatly appreciated.

If you'd like to help maintain the perlfaq, see the details in

Site Timeline