#!/usr/bin/perl use CGI qw(:standard); use CGI::Carp qw(fatalsToBrowser); use strict; use warnings; use vars qw($fullname $anslength @allselections $file $fname $lname $t +ime $reviewtime $idinput $id $courselocation $useripaddress $question +no @log $clocktime $log $type $value @answers $buttonname %selections + @options); my @allquestions; my @allanswers; my @explain; print header; # ********************************* DEFINE VARIABLES $time = param('time'); $reviewtime = param('reviewtime'); $file = param('file'); $idinput = param('idinput'); $fullname = param('fullname'); $fname = param('fname'); $lname = param('lname'); $courselocation = substr($file, 0, 6); $useripaddress = $ENV{REMOTE_ADDR}; $questionno = 0; print "<HTML><HEAD>"; print "<TITLE>Exam</TITLE>"; print "</HEAD>"; print qq/<BODY BGCOLOR=beige onLoad="begintimer()">/; makeexam(); # ******************* START SUBROUTINE MAKEEXAM sub makeexam() { local $/ = "~\n"; # ** CHANGES INPUT RECORD SEPARATOR TO ~line break # ************************** THIS SECTION CREATES THE HTML FOR THE EXA +M. chop($fname); $fname = lc($fname); $lname = lc($lname); $fname = ucfirst($fname); $lname = ucfirst($lname); # ********************************** RECORD ACCESS TO THE EXAM $clocktime = localtime; @log = split(/\//, $file); @log = split(/\./, $log[1]); $log = $log[0]; $log = $log.".log"; open ACCESS, ">>$log" || die "Cannot open $log: $!"; print ACCESS $idinput . " " . $lname . " " . $fname . " " . $clocktim +e . " " . $useripaddress . " " . $time . "\n"; close(ACCESS); # ********************************** END SCRIPT TO RECORD ACCESS TO TH +E EXAM print "<H2>Hello $fullname!</H2><P>"; print start_form (-name=>'makequiz', -method=>'POST', -action=>"http:/ +/ist221.nsm.tridenttech.edu/perl/gradequiz.cgi"); chdir("/perl/web"); open FILE, "$file" || die "Cannot open $file: $!"; while (<FILE>) { # ** READS EACH LINE OF TEXT FROM FILE chomp; # ** BY DEFAULT, CHOMPS OFF $/ F +ROM EACH LINE ($type, $value) = split (/:#\s*/, $_); # ***** SPLITS EACH LIN +E BY TYPE AND CONTENT if ($type =~ m/i/i) { # ** CHECKS FOR IMAGE print "<IMG SRC=http://ist221.tridenttech.edu/images/$courselocation/$ +value>"; print "<P>"; }elsif ($type =~ m/q/i) { # ** CHECKS FOR QUESTION LINE & PRINT +S QUESTION $questionno++; print "<B>$questionno. $value</B><BR>"; push(@allquestions, $value); }elsif ($type =~ m/a/i) { # ** CHECKS FOR ANSWER LINE @answers = split (/`\s*/, $value); $anslength = @answers; # ** LENGTH OF @ANSWERS push(@allanswers, $value); }elsif ($type =~ m/s/i) { # ** CHECKS FOR SELEC +TION LINE $buttonname = $type . $questionno; push(@allselections, $value); %selections = split (/`\s*/, $value); @options = keys (%selections); if ($anslength > 1) { # ** DETERMINE +S TO USE RADIO OR CHECKBOX print "<BR>"; print checkbox_group(-name=>$buttonname, -v +alues=>\@options, -linebreak=>'true', -labels=>\%selections); }else { print "<BR>"; print radio_group(-name=>$buttonname, -values +=>\@options, -linebreak=>'true', -labels=>\%selections, -default=>'-' +); } print "<BR><HR><BR>"; }elsif ($type =~ m/e/i) {# ** CHECKS FOR EXPLAINATION +LINE push (@explain, $questionno, $value); } # END ELSIF STATEMENTS } # ** END WHILE STATEMENT close (FILE); print "<CENTER>"; # ** THIS SECTION SENDS THREE ARRAYS TO THE GRADEQUIZ.CGI print hidden(-name=>"answers", -default=>\@allanswers); print hidden(-name=>"questions", -default=>\@allquestions); print hidden(-name=>"selections", -default=>\@allselections); print hidden(-name=>"explain", -default=>\@explain); print hidden(-name=>'fname', -value=>$fname); print hidden(-name=>'lname', -value=>$lname); print hidden(-name=>'reviewtime', -value=>$reviewtime); print hidden(-name=>'file', -value=>$file); print hidden(-name=>'id', -value=>$idinput); print submit (-value=>'Grade'); print "</CENTER>"; print end_form; } print "The last element in the questions array is $#allquestions<p>"; # ************************* END SUBROUTINE MAKEEXAM print end_html;
"The last element in the questions array is $#allquestions"
When I restart the web server and start fresh, the last element is 4. If I close out the quiz and then click the link to start the quiz again, the last element is -1. This continues until I restart my server again. I read about mod_perl and the arrays not re-initializing, but I can't figure out where I need to make my changes. I've tried a number of ways of initializing the variables, but can't seem to get it right. Can you shed some light on how I'm suppose to reinitialize the arrays and why perl is doing what its doing?
Also, I've noted what Ovid mentioned in my last posting about the security issue using param('file'), but I'll deal with that after I get the script running.
Many thanks.
Chris
Edit g0n - added readmore tags
In reply to Can't seem to reinitalize arrays by chriso
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |