#!perl -w # $Id: sort-books,v 1.2 2008/07/23 17:36:06 drhyde Exp $ use strict; use Sort::MultipleFields qw(mfsort); use Data::Dumper; # Let's assume you have a Crazy Library, which contains each of these seven # works. You've got 21 copies of each book (!). For each one you have seven # copies published in each of 2001, 2002 and 2003, with the seven colours # of the rainbow on their spines. They are in a completely random order. my $library = [ sort { rand() < 0.5 ? 1 : -1 } # <-- random order map { { %{$_}, year => 2001 }, { %{$_}, year => 2002 }, { %{$_}, year => 2003 }, } map { my $in = $_; map { { %{$in}, colour => $_ } } qw(red orange yellow green blue indigo violet) } ( { author => 'Clarke', title => 'Islands In The Sky' }, { author => 'Hoyle', title => 'Black Cloud, The' }, { author => 'Clarke', title => 'Prelude to Space' }, { author => 'Asimov', title => 'Pebble in the Sky' }, { author => 'Asimov', title => 'Foundation' }, { author => 'Clarke', title => 'Rendezvous with Rama' }, { author => 'Asimov', title => 'David Starr, Space Ranger' } ) ]; # You want to sort the books first by author, then by title, then by # reverse year of publication (ie, most recent first) and finally by # colour, in the order of the colours in the rainbow. Do it thus: $library = mfsort { author => 'asc', title => 'asc', year => 'desc', colour => sub { my @in = map { $_ eq 'red' ? 0 : $_ eq 'orange' ? 1 : $_ eq 'yellow' ? 2 : $_ eq 'green' ? 3 : $_ eq 'blue' ? 4 : $_ eq 'indigo' ? 5 : 6 } @_; $in[0] <=> $in[1]; } } $library; print Dumper($library);