Here is a start:
        You would pull from the hash, but easier for testing to just use __DATA__ and 
using map , I have the following setup:
        0 - the date
        1 - month
        2 - day
        3 - year
        So you compare first vs year, then if necessary to month followed by day.
        Like I say, a start for you.

foreach my $key (sort { $a->[3] <=> $b->[3] || $a->[1] <=> $b->[1] || $a->[2] <=> 
$b->[2]} map{ [ $_, /^(\d+).(\d+).(\d+)/ ] } <DATA>) {
   printf "%-s", $key->[0];
 }
 
__DATA__
12/01/01
02/01/02
11/15/01
12/14/00
^----Script ends here

Output:
12/14/00
11/15/01
12/01/01
02/01/02

Wags ;)


-----Original Message-----
From: Pellerin, Dale [mailto:[EMAIL PROTECTED]]
Sent: Wednesday, November 28, 2001 08:03
To: [EMAIL PROTECTED]
Subject: Sorting a Hash


I am very new to hashes (as well as Perl) and am having some difficulty with
a cgi script.  This script allows individuals to post "announcements" via a
form.  The form data is stored in a text file, sorted in descending order by
date, and printed to the html page.  However, the script is currently
sorting by the month and not by the year, thus creating a problem when news
items are posted from 2002. (01/01/02 news items are being printed below
12/01/01 news items)

Here is a sample of the text file that the data is stored in:

http://is-blah.com/corprate/pages/news/cafeteria_closed.htm ~ 10/24/01 ~
Cafeteria closed

Here is  a snippet of code from the cgi script that sorts the file:

# Hash to sort date
$from = "tmc.dat";
my %h;                                          

open(FILE, "$from") || die "Can't open $from!\n";
while (<FILE>) {
   chomp;
   ($announcement,$date,$description) = split(/~/,$_);
   
   # if the date has already been seen, tack this entry on to the hash value
    if( $h{$date} ){ 
        $h{$date} .= "|$announcement~$description";
    }    
    
    # date hasn't been seen, so create a new hash entry
    else
    {
        $h{$date} = "$announcement~$description";
    }
}

#sort the dates in desc. order
foreach $key (sort {$b cmp $a} keys %h)
{
   #do for each item for that date
    @items = split '\|', $h{$key};
    foreach $item (@items)
    {
        #split back out the values and print the table
        my($announcement,$description) = split /~/,$item;
        print "<table width=800><tr>";
        print "<td><img border=0 width=14 height=14 id='_x0000_i1027'
src='http://is-web/corprate/gifs/blueball.gif'>";
        print "<ALIGN='left'><span style='font-size:13.5pt'><a
href=\"$announcement\"><font color=blue>$description</font></a>(<font
color=black> $key)</font></td>";
        print "</tr></table><br>";

I would appreciate any assistance in figuring out how to sort by year, then
by month.  

Thank you.

Dale

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to