Fancier Sorting

As you learned back in Chapter 6, we can customize how the sort function sorts things by giving it an explicit sort block, which is a curly-brace-delimited block containing instructions on how to sort two special variables, $a and $b.

Let’s look at some examples, working from simple sorts to more complex ones:

@ary    = ('b', 'c', 'a');

@sorted = sort @ary;                # @sorted gets: a, b, c
@sorted = sort { $a cmp $b } @ary;  # same thing
@sorted = sort { $b cmp $a } @ary;  # reversed: c, b, a

This first example demonstrates something you already learned back in Chapter 6. Namely, that the cmp string-comparison operator, used in the sort block { $a cmp $b }, gives the same result as sort’s default behavior, which is to sort a list into ascending ASCII order. It also demonstrates something you haven’t seen before: how to sort in descending order. You do that simply by switching the places of the $a and $b variables in the sort block.

Since ASCII order gives case-sensitive sorting, with all the uppercase letters sorting first, here’s a technique (also demonstrated back in Chapter 6) to overcome that behavior in situations where you actually want case-insensitive sorting:

@ary    = ('b', 'c', 'a', 'Y', 'X', 'Z');

@sorted = sort { $a cmp $b } @ary; # case-sensitive ASCII-order sort.
                                   # @sorted gets: X, Y, Z, a, b, c
                                         
@sorted = sort { lc $a cmp lc $b } @ary; # case-insensitive sort, now.
                                         # gives: a, b, c, X, Y, Z

All this is fine when you want to sort strings, but what about sorting numbers? ...

Get Perl for Web Site Management now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.