Beefy Boxes and Bandwidth Generously Provided by pair Networks
Come for the quick hacks, stay for the epiphanies.
 
PerlMonks  

Re: Sort Hash array using date

by gone2015 (Deacon)
on Jan 15, 2009 at 17:40 UTC ( [id://736608] : note . print w/replies, xml ) Need Help??


in reply to Sort Hash array using date

You appear to want to sort into conventional time order, but your date string will sort by day number, then by month and then by year -- which is backwards... Then you are sorting by seconds, then minutes and then hours -- also backwards. Or is that really what you want ?

The problem appears to be in two parts: (a) construct something that will sort into the order you want, (b) map that back to your actual keys. Perhaps:

use strict ; use warnings ; my %Date_Time = ( '03-12-2008' => { '0' => { '8' => { '5' => 'a', '15' => 'b', }, '08' => { '22' => 'c', '05' => 'd', }, }, }, '04-12-2008' => { '0' => { '5' => { '8' => 'e', }, }, }, '05-12-2008' => { '0' => { '5' => { '9' => 'f', }, }, }, ) ; my @order ; foreach my $date (keys %Date_Time) { my ($d, $m, $y) = split(/-/, $date) ; my $o = sprintf("%04d%02d%02d", $y, $m, $d) ; foreach my $sec (keys %{$Date_Time{$date}}) { foreach my $min (keys %{$Date_Time{$date}{$sec}}) { foreach my $hour (keys %{$Date_Time{$date}{$sec}{$min}}) { + push @order, $o . sprintf("%02d%02d%02d", $hour, $min, $sec) . ":$date:$hour:$min:$sec" ; } ; } ; } ; } ; @order = sort @order ; foreach my $o (@order) { my (undef, $date, $hour, $min, $sec) = split(/:/, $o) ; print "Date=>$date $hour:$min:$sec = ", $Date_Time{$date}{$sec}{$min +}{$hour}, "\n" ; } ;