perlquestion
Ryszard
search
super
<p>I'm writing a web based calander, and want to display a month (or more) in a html table, add links and pull out whatever data is associated with the link (ala the yahoo datebook).</P>
<p>
Now i've got it printing out a nice little table with all the dates in the correct spots etc, (which is good) but i'm iterating thru' three loops. one to pull out the days, one to build a monthly matrix (much like the `cal` command), and the final loop builds the html.
</P><p>
I'm thinking this is pretty slow and inefficient, and was wondering if there is a better way.
</P><p>
I thought of using a hash for the number of days in a month (and making the appropriate exceptions for a LY, then determining what day is the 1st of the month) however i'm still stuck with two loops.
</P><p>
Naturally any comments on the style of the code appreciated.
</P>
<code>
#!/usr/bin/perl -w
use strict;
use Data::Dumper;
use Date::Calc qw( Delta_Days Add_Delta_Days Date_to_Text );
use CGI;
my $q = new CGI;
sub date_range {
my(@date) = (@_)[0,1,2];
my(@list);
my($i);
my $output = '';
my $date;
my %pos = (Su=>1,
Mo=>2,
Tu=>3,
We=>4,
Th=>5,
Fr=>6,
Sa=>7
);
my @box;
$i = Delta_Days(@_);
while ($i-- >= 0) {
push( @list, [ @date ] );
@date = Add_Delta_Days(@date, 1) if ($i >= 0);
}
#build the matrix to hold the days.
my @box; #the arrray to hold the calendar data
my $row=0;
foreach $date (@list) {
my $col = $pos{substr(Date_to_Text(@{$date}),0,2)};
$box[$row][$col]= (@{$date}[2]);
if ($col eq 7) {$row++}
}
for (my $i=0; $i<5; $i++){
$output .= "<tr>";
for (my $j=0; $j<8;$j++){
if (! defined $box[$i][$j]) {
$output .= $q->td({align=>"right"}," ");
} else {
$output .= $q->td({align=>"right"},$box[$i][$j]);
}
}
$output .= "</tr>";
}
return $output;
}
print $q->header();
print $q->table(&date_range(2001,11,1, 2001,11,30)); # in chronological order
</code>