OK, I'm a newbie trying to do things in perl that are smarter than I am. I'm working on a CGI clock-in program for where I work, and I want it to be one CGI script with multiple pages, each a step in the clocking in process (gathering different bits of info and confirming). I got the idea of doing it this way when I saw the example in the Perl Cookbook, at the end of Chapter 19. I looked it over, and started trying to generate the basics of my own program using the other as a model (read: 'borrowing' bits of that code).
What I'm having trouble understanding is how, when the script is run, only one page comes up in the browser. When I did my example, using pretty much the same code, I got all my pages dumped on one page together in the browser. The part of code that worked in the example (and mine is basically identical) is: (All this code is from the Perl Cookbook by Tom Christiansen & Nathan Torkington, and this code is theirs not mine) my %States; # state table mapping pages to functions my $Current_Screen; # the current screen # Hash of pages and functions. %States = ( 'Default' => \&front_page, 'Shirt' => \&shirt, 'Sweater' => \&sweater, 'Checkout' => \&checkout, 'Card' => \&credit_card, 'Order' => \&order, 'Cancel' => \&front_page, ); $Current_Screen = param(".State") || "Default"; die "No screen for $Current_Screen" unless $States{$Current_Screen}; # Generate the current page. standard_header(); while (my($screen_name, $function) = each %States) { $function->($screen_name eq $Current_Screen); } standard_footer(); exit; Now, I think I know what's going on here basically, making references to the subroutines where the pages are detailed. My program just spits out all the pages at once. The example doesn't, it does it correctly. Here's one of the page subroutines: # Page to order a shirt from. sub shirt { my $active = shift; my @sizes = qw(XL L M S); my @colors = qw(Black White); my ($size, $color, $count) = (param("shirt_size"), param("shirt_color"), param("shirt_count")); # sanity check if ($count) { $color = $colors[0] unless grep { $_ eq $color } @colors; $size = $sizes[0] unless grep { $_ eq $size } @sizes; param("shirt_color", $color); param("shirt_size", $size); } unless ($active) { print hidden("shirt_size") if $size; print hidden("shirt_color") if $color; print hidden("shirt_count") if $count; return; } print h1("T-Shirt"); print p("What a shirt! This baby is decked out with all the options.", "It comes with full luxury interior, cotton trim, and a collar", "to make your eyes water! Unit price: \$33.00"); print h2("Options"); print p("How Many?", textfield("shirt_count")); print p("Size?", popup_menu("shirt_size", \@sizes ), "Color?", popup_menu("shirt_color", \@colors)); shop_menu(); } Now, I'm guessing the $active variable has something to do with my problem. Can someone explain what's happening here? I'm totally confused. Justin