Checkbox Group Illustration: Digital Clock
#!/usr/bin/perl -w

use CGI qw(:standard);
use CGI::Carp qw(fatalsToBrowser);

($min, $hour, $mday, $month, $year, $day) = (localtime(time))[1..6];

$month = (Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec)[$month];
$day   = (Sun,Mon,Tue,Wed,Thu,Fri,Sat)[$day];

$year += 1900;

if (param('Set'))
 #  Param returns a LIST (!) of the parameters i.e., the ones
 #  specified in the -value part of the checkbox_group call.
      @timeparts = param('time_parts');
      $time = sprintf "%02d", $hour if grep {/hour/} @timeparts; 
      $time .= sprintf ":%02d", $min if grep {/min/} @timeparts; 
      $time .= " $day" if grep {/^day$/} @timeparts;
      $time .= " $month" if grep {/^month$/} @timeparts;
      $time .= " $mday" if grep {/day-of/} @timeparts;
      $time .= " $year" if grep {/year/} @timeparts;
      print header, start_html, p("The time is: $time"), end_html;

print header;
print start_html("Digital Clock!"), h1("Digital Clock!");
print start_form(),
      "Show: ",
 # -override means that after the time is given, all the checkboxes are
 # CLEARED!!  Usually, settings given by a user are "sticky" between one
 # call to a script and another call. 
      checkbox_group(-name => 'time_parts',
                     -value => ['hours', 'minutes', 'month', 'day-of-month',
                               'day', 'year'], -override => 1),
      p(), reset(-name=>'Reset'), submit(-name => 'Set'), end_form;

print end_html;