http://qs1969.pair.com?node_id=11140581


in reply to Re^4: Get most recent data based on a date from an array of hashes.
in thread Get most recent data based on a date from an array of hashes.

If you're sorting $a cmp $b the most recent will be in the last element rather than the first so pull out $sorted[-1] instead. The alternative is to swap the order of comparison ($b cmp $a) and then the most recent will be first.

#!/usr/bin/env perl use 5.032; my @dates = qw( 02-03-2003 03-01-2015 01-15-2022 ); my @sorted = sort { my $new_a = join( q{-}, (split(/-/,$a))[2,0,1] ); my $new_b = join( q{-}, (split(/-/,$b))[2,0,1] ); $new_b cmp $new_a } @dates; say $sorted[0]; __END__ $ perl blonk.plx 01-15-2022

The cake is a lie.
The cake is a lie.
The cake is a lie.

Replies are listed 'Best First'.
Re^6: Get most recent data based on a date from an array of hashes.
by Anonymous Monk on Jan 19, 2022 at 17:52 UTC
    I liked your approach to this, just one question, the code works with the dates in MM-DD-YYYY and YYYY-MM-DD, is this on this part of the code "2,0,1", that's the part I am confused with it, thanks!
    #!/usr/bin/env perl #use 5.032; use strict; use warnings; use Data::Dumper; my @dates = qw( 02-03-2003 03-01-2022 01-15-2022 01-15-2023 01-15-2001 + 11-15-2023); #my @dates = qw( 2003-02-03 2015-03-01 2032-01-15 2023-01-15 2001-01-1 +5 2028-11-15); print "\n\n ".Dumper \@dates; my @sorted = sort { my $new_a = join( q{-}, (split(/-/,$a))[2,0,1] ); my $new_b = join( q{-}, (split(/-/,$b))[2,0,1] ); $new_b cmp $new_a } @dates; print "\n\n $sorted[0]\n\n";

      It doesn't work for MM-DD-YYYY; it seems to work because you've managed to (luckily and/or unintentionally) pick data for which it works. For a counter example look what it'd do to "01-16-2000" and "01-13-2022" sorting newest to oldest. You need to use YMD for lexigraphic sorting to work.

      my @d = qw( 01-13-2022 01-16-2000); say for sort { $b cmp $a } @d;

      As for the syntax giving you pause, that's just a list slice reordering elements. split(/-/,$a) returns a list of MM, DD, YYYY and then passes the list YYYY, MM, DD to join to be put back together. Search for "Slices" in perldata.

      The cake is a lie.
      The cake is a lie.
      The cake is a lie.