in reply to Combining s///

Assuming you want to keep the dates in MM/DD/YY format, you could use a sort of Schwartzian Transform to do the sorting. The original date string is carried through the process unchanged and pulled out at the end (in the top map) and the month day and year are separated out so they are available to sort in the first (bottom-most) map. The middle map transforms the year so that (arbitrarily) any year >= 30 belongs to the 20th century and the rest belong to the 21st.

use strict; use warnings; my $cutoff = 30; print map { $_->[0] } sort { $a->[3] cmp $b->[3] || $a->[1] cmp $b->[1] || $a->[2] cmp $b->[2] } map { $_->[3] += $_->[3] >= $cutoff ? 1900 : 2000; $_ } map { [ $_, m{(\d\d)/(\d\d)/(\d\d)} ] } <DATA>; __END__ 12/24/99 09/06/04 12/03/99 06/24/99 10/17/98 04/24/99

The output.

10/17/98 04/24/99 06/24/99 12/03/99 12/24/99 09/06/04

I hope this is of interest.

Cheers,

JohnGG

Replies are listed 'Best First'.
Re^2: Combining s///
by ikegami (Patriarch) on Mar 10, 2008 at 00:08 UTC
    Since you're transforming anyway, might as well put it in a more easily sortable format!
    map { $_->[0] } sort { $a->[1] cmp $b->[1] } map { my ($m, $d, $y) = m{(\d\d)/(\d\d)/(\d\d)}; $y += y >= $cutoff ? 1900 : 2000; [ $_, sprintf('%04d/%02d/%02d', $y, $m, $d) ] }

    Or for extra speed, avoid creating all those arrays and references.

    map { substr($_, 10) } sort map { my ($m, $d, $y) = m{(\d\d)/(\d\d)/(\d\d)}; $y += $y >= $cutoff ? 1900 : 2000; sprintf('%04d/%02d/%02d', $y, $m, $d) . $_ }

    Update: Added missing $.