Chapter 7. Practical Reference Tricks
This chapter looks at optimizing sorting and dealing with recursively defined data.
Review of Sorting
Perl’s built-in
sort
operator sorts text strings in their natural
text order, by default.[29]
This is fine if you want to sort text strings:
my @sorted = sort qw(Gilligan Skipper Professor Ginger Mary_Ann);
but gets pretty messy when you want to sort numbers:
my @wrongly_sorted = sort 1, 2, 4, 8, 16, 32;
The
resulting list is 1
,
16
, 2
, 32
,
4
, 8
. Why didn’t
sort
order these properly? It treats each item as
a string and sorts them in string order. Any string that begins with
3
sorts before any string that begins with
4
.
You can fix this by overriding how Perl
compares pairs of items in the list. By default, as Perl orders the
items, a string comparison is used. A new comparison is specified
using a sort block, placed between the
sort
keyword and the list of things to
sort.[30]
Within the sort block, $a
and
$b
stand in for two of the items to be sorted. The
last evaluated expression must return a -1
,
0
, or +1
value.[31] If the value is
-1
, the value currently in $a
must appear before the value in $b
in the final
sorted list. If the value is +1
, then the value in
$a
must appear after the value in
$b
in the final sorted list. If the value is 0,
you don’t know or can’t tell, so
the results are unpredictable.[32]
For example, to sort those numbers in their proper order, you can use
a sort block comparing $a
and
$b
, like so:
my @numerically_sorted = sort ...
Get Learning Perl Objects, References, and Modules 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.