I was interested by this question -- and let me say, of course the correct answer is, "use the module" -- I just took the opportunity to try learn a bit about more advanced sorting.

The following is of course a very roundabout solution, but it shows how you can sort by an arbitrary quality you assign yourself (as you might if you wanted to sort the months from financial year to financial year where April might be 1 and March 12) and how to sub-sort.

I'd appreciate your comments.

#!/usr/bin/perl
use strict;
use warnings;
use diagnostics;
use Data::Dumper;

my %months = ( Jan => 1, Feb => 2, Mar => 3, Apr => 4 );
## Assign values to the month names,
## I'm too lazy to do the whole 12.

my @dates = qw(
  Apr-2005 Feb-2001 Mar-2001
  Jan-2004 Jan-2005 Mar-2005
  Feb-2003 Mar-2003 Apr-2003
  Mar-1999 Apr-1999 Feb-2002
);
## randomly chosen dates in random order

my @data = ();

for ( @dates ) {
    my ( $m, $y ) = split( '-', $_ );
    push( @data, { year => $y, month => $m } );
}
## build AoH from dates

@data = sort {
    $a->{year} <=> $b->{year}
      ||
    $months{ $a->{month} } <=> $months{ $b->{month} }
} @data;

## only if the years are equal does the second sort take place, is that right?

print Dumper( [EMAIL PROTECTED] );

## seems to work:

# $VAR1 = [
#           {
#             'month' => 'Mar',
#             'year' => 1999
#           },
#           {
#             'month' => 'Apr',
#             'year' => 1999
#           },
#           {
#             'month' => 'Feb',
#             'year' => 2001
#           },
#           {
#             'month' => 'Mar',
#             'year' => 2001
#           },
#           {
#             'month' => 'Feb',
#             'year' => 2002
#           },
#           {
#             'month' => 'Feb',
#             'year' => 2003
#           },
#           {
#             'month' => 'Mar',
#             'year' => 2003
#           },
#           {
#             'month' => 'Apr',
#             'year' => 2003
#           },
#           {
#             'month' => 'Jan',
#             'year' => 2004
#           },
#           {
#             'month' => 'Jan',
#             'year' => 2005
#           },
#           {
#             'month' => 'Mar',
#             'year' => 2005
#           },
#           {
#             'month' => 'Apr',
#             'year' => 2005
#           }
#         ];
#





Reply via email to