in reply to Sorting Dates Issue

Your idea of extracting year, month and day then concatenating them so they sort naturally is fine. You could take it a little further and apply a Guttman Rosler Transform instead of a sort routine. This node has an explanation and this is the paper on the technique. I think split might be an easier way of extracting date elements than a regex.

knoppix@Microknoppix:~$ perl -E ' > @dates = qw{ > 10/02/2004 > 02/01/2004 > 01/02/2004 > 01/06/2004 > 01/02/2005 > 01/12/2004 > 08/18/2010 > }; > say for > map { substr $_, 8 } > sort > map { join q{}, ( split m{/} )[ 2, 0, 1 ], $_ } > @dates;' 01/02/2004 01/06/2004 01/12/2004 02/01/2004 10/02/2004 01/02/2005 08/18/2010 knoppix@Microknoppix:~$

I hope this is of interest.

Cheers,

JohnGG

Replies are listed 'Best First'.
Re^2: Sorting Dates Issue
by Anonymous Monk on Aug 18, 2010 at 17:54 UTC
    Yes it works, how could this code do the sorting in reverse, I mean the most recent date on top?
    use strict; my @dates = qw{ 10/02/2004 02/01/2004 01/02/2004 08/18/2010 01/06/2004 01/02/2005 01/12/2004 }; my @sorted= map { substr $_, 8 } sort map { join q{}, ( split m{/} )[ 2, 0, 1 ], $_ }@dates;

    Thanks!

      Once the elements to be sorted have been combined into a single string it is just a lexical sort so you can use a simple anonymous routine to reverse the order.

      knoppix@Microknoppix:~$ perl -E ' > @dates = qw{ > 10/02/2004 > 02/01/2004 > 01/02/2004 > 01/06/2004 > 01/02/2005 > 01/12/2004 > 08/18/2010 > }; > say for > map { substr $_, 8 } > sort { $b cmp $a } > map { join q{}, ( split m{/} )[ 2, 0, 1 ], $_ } > @dates;' 08/18/2010 01/02/2005 10/02/2004 02/01/2004 01/12/2004 01/06/2004 01/02/2004 knoppix@Microknoppix:~$

      Cheers,

      JohnGG