Sticking with #3 above. (this is untested code... it probably won't compile, but you get the idea).
my @days = qw( Monday Tuesday Wednesday Thursday Friday Saturday Sunda
+y );
my @hours = (7..21); # use the start hour for the value;
my $out = qq(<tr>
<td>Day</td>);
for my $hour (@hours) {
$out .= "<td>$hour - " . $hour + 1 . "</td>";
for my $day (@days) {
$out .= qq( <tr>
<td>$day</td>);
for my $hour (@hours) {
$out .= qq(<td><input type="checkbox" name="$day" value="$hour" /><
+/td>);
}
$out .= qq(</tr>);
}
# so now you've printed out the form;
# now to get the data out of it:
use CGI;
my $q = CGI->new;
for my $day (@days) {
@hours = $q->param($day);
# the hours for the day are now in the array.
$Hours->{$day} = \@hours;
}