Easy.
use strict;
use Data::Dumper;
my %list = (
A => '1.13.04:Record:A',
B => '1.12.04:Record:B',
C => '3.13.04:Record:C',
);
my @sorted_date =
map { $_->[0] }
sort { $b->[1] <=> $a->[1] }
map { my @n = /^(\d+)\.(\d+)\.(\d+):/;
my $d = sprintf "%02d%02d%02d", @n[2,0,1];
[join('.',@n), $d] } values %list;
print Dumper(\@sorted_date);
OK, here's another variant of the sort that produces the HTML table as required...
use strict;
use Data::Dumper;
my %list = (
A => '1.13.04:Record:A',
B => '1.12.04:Record:B',
C => '3.13.04:Record:C',
D => '3.13.02:Record:D',
);
my @sorted_date =
map { [ $_->[1], $_->[0], $_->[2] ] }
sort { $b->[1] <=> $a->[1] }
map { my @n = $list{$_} =~ /^(\d+)\.(\d+)\.(\d+):/;
my $d = sprintf "%02d%02d%02d", @n[2,0,1];
[join('.',@n), $d, $_] } keys %list;
my $month;
foreach (@sorted_date) {
my $m = substr($_->[0], 0, 4); # retrieve YYMM
if ($month ne $m) {
print "</table>\n" if $month;
$month = $m;
print "<table>\n";
}
print "<tr><td>$_->[1]</td><td>HASH key: $_->[2]</td></tr>\n";
}
print "</table>\n" if $#sorted_date >= 0;
And the output is:
<table>
<tr><td>3.13.04</td><td>HASH key: C</td></tr>
</table>
<table>
<tr><td>1.13.04</td><td>HASH key: A</td></tr>
<tr><td>1.12.04</td><td>HASH key: B</td></tr>
</table>
<table>
<tr><td>3.13.02</td><td>HASH key: D</td></tr>
</table>