Beefy Boxes and Bandwidth Generously Provided by pair Networks
go ahead... be a heretic
 
PerlMonks  

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

by Anonymous Monk
on Jan 18, 2022 at 19:10 UTC ( #11140577=note: print w/replies, xml ) Need Help??


in reply to Re^3: 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.

Yes, but still cant get the result of the most recent date from the array:
$mdy =~ m{^(\d{1,2})\D(\d{1,2})\D(\d{4}|\d{4}\s+)}; return "$3-$1-$2";
  • Comment on Re^4: Get most recent data based on a date from an array of hashes.

Replies are listed 'Best First'.
Re^5: Get most recent data based on a date from an array of hashes.
by Fletch (Bishop) on Jan 18, 2022 at 19:59 UTC

    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.

      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.

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://11140577]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others examining the Monastery: (3)
As of 2022-05-28 14:38 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    Do you prefer to work remotely?



    Results (99 votes). Check out past polls.

    Notices?