in reply to Sort directories by date

Or the short-answer, for those who don’t want to answer a quiz to get it, would be ... to use a sort-compare subroutine, inline or otherwise, along these lines:   (untested)

sort { substr($a, 4, 4) cmp substr($b, 4, 4) || substr($a, 2, 2) cmp substr($b, 2, 2) || substr($a, 0, 2) cmp substr($b, 0, 2) } ...

The sort verb accepts as its first argument a function that, given two “magic variables” $a and $b, must return a value that is less than, equal to, or greater than zero.   The <=> (numeric) and cmp (string) operators are specifically designed for this purpose.   Here, in a simple in-line subroutine, we use the || logic-OR operator, which we know uses “short circuiting,” to return the first of three alternatives that is not zero.   First, we compare the year.   Then, the month, then the day.   (The first position in a Perl string is position zero.)

Replies are listed 'Best First'.
Re^2: Sort directories by date
by johngg (Canon) on Sep 28, 2015 at 21:33 UTC

    Unfortunately, you have your month and day fields transposed as the third date in the list shows that the format is MMDDYYYY, there not being a month 20 in the year!

    If there are many directories to sort there might be some benefit in using a more advanced sorting approach rather than repeatedly substr'inging the same fields as each date is compared with others in turn. I have used unpack as an alternative to substr in the following code. A Schwartzian transform:-

    $ perl -Mstrict -Mwarnings -E ' my @dates = qw{ 12112014 01052015 02202015 03102015 01012011 04092015 09092015 }; say for map { $_->[ 0 ] } sort { $a->[ 3 ] <=> $b->[ 3 ] || $a->[ 1 ] <=> $b->[ 1 ] || $a->[ 2 ] <=> $b->[ 2 ] } map { [ $_, unpack q{a2a2a4}, $_ ] } @dates;' 01012011 12112014 01052015 02202015 03102015 04092015 09092015 $

    Guttman Rosler transform:-

    $ perl -Mstrict -Mwarnings -E ' my @dates = qw{ 12112014 01052015 02202015 03102015 01012011 04092015 09092015 }; say for map { substr $_, 8 } sort map { join q{}, ( unpack q{a2a2a4}, $_ )[ 2, 0, 1 ], $_ } @dates;' 01012011 12112014 01052015 02202015 03102015 04092015 09092015 $

    I hope this is of interest.

    Cheers,

    JohnGG