develooper Front page | perl.macosx | Postings from March 2005

Re: Sorting year and month

Thread Previous | Thread Next
From:
John Horner
Date:
March 1, 2005 21:14
Subject:
Re: Sorting year and month
Message ID:
a06110401be4af9844d2f@[10.25.230.138]
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( \@data );

## 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
#           }
#         ];
#




Thread Previous | Thread Next


nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About