Beefy Boxes and Bandwidth Generously Provided by pair Networks
Clear questions and runnable code
get the best and fastest answer
 
PerlMonks  

Re: sort timestamps with associated names.

by choroba (Cardinal)
on Jul 25, 2013 at 13:35 UTC ( [id://1046339]=note: print w/replies, xml ) Need Help??


in reply to sort timestamps with associated names.

There is more than one way to do it:
#!/usr/bin/perl use warnings; use strict; my @data = ('RRsnap02 2013-07-24 12:35:35', 'vmk000 2013-07-22 17:16:50', 'vmk001 2013-07-22 20:00:36', 'vmk009 2013-07-23 18:21:12', 'vmk010 2013-07-23 18:31:00', 'vmk020 2013-07-23 23:30:43', 'vmk024 2013-07-24 03:27:30', 'vmk031 2013-07-24 10:27:36', 'vmk032 2013-07-24 11:27:38', 'vmk032 2013-07-24 11:27:38', ); sub get_date { my $s = shift; $s =~ s/^\S+\s+//; return $s; } # Simple: print "$_\n" for sort { get_date($a) cmp get_date($b) } @data; # Faster, Schwartzian transform, computes get_date just once for each +line: print "$_\n" for map $_->[1], sort { $a->[0] cmp $b->[0] } map [ get_date($_), $_ ], @data; # Orcish maneuver, compute get_date only when needed and cache: my %cache; print "$_\n" for sort { ( $cache{$a} //= get_date($a) ) cmp ( $cache{$b} //= get_date($b) ) } @data; # Guttman Rosler Transform, changing to strings for default sort: print "$_\n" for map { s/(.*) (\S+\s+)$/$2$1/; $_ } sort map { s/^(\S+\s+)(.*)/$2 $1/; $_ } @data;
لսႽ† ᥲᥒ⚪⟊Ⴙᘓᖇ Ꮅᘓᖇ⎱ Ⴙᥲ𝇋ƙᘓᖇ

Replies are listed 'Best First'.
Re^2: sort timestamps with associated names.
by hdb (Monsignor) on Jul 25, 2013 at 13:43 UTC

    Instead of get_date($_) you can use /(.{19})$/.

Re^2: sort timestamps with associated names.
by Loops (Curate) on Jul 26, 2013 at 10:39 UTC
    ++ for a very informative answer. Have just been playing with Sort::Maker that will return a sub reference encapsulating any of the four types of sorting routines you ably demonstrated above. While it's not much savings for the plain case, you can alter your choice by changing one keyword:
    use Sort::Maker; print make_sorter(qw/plain string substr($_,10)/)->(<DATA>); __DATA__ RRsnap02 2013-07-24 12:35:35 vmk000 2013-07-22 17:16:50 vmk001 2013-07-22 20:00:36 vmk009 2013-07-23 18:21:12 vmk010 2013-07-23 18:31:00 vmk020 2013-07-23 23:30:43 vmk024 2013-07-24 03:27:30 vmk031 2013-07-24 10:27:36 vmk032 2013-07-24 11:27:38 vmk032 2013-07-24 11:27:38
    The generated code is straight forward:
    sort { do{ my( $left, $right ) = map { substr($_,10) } $a, $b; $left cmp $right } } @_;
    You could replace 'plain' with 'orcish', 'ST', or 'GRT' -- and for the ST case, the generated code is:
    return map $_->[0], sort {$a->[1] cmp $b->[1]} map [ $_, do{ my ($val) = substr($_,10) ; $val } ], @_ ;

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others surveying the Monastery: (4)
As of 2024-04-19 04:51 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found