Ok, I ran the script through perltidy and eliminated the global variables, yet the number of questions in the questions array is still -1 when I access the script more than once. So, when the questions are numbered, instead of starting with 1, it begins with the next number after the last time the questions were displayed. What more can I do? Here is the cleaned up code:
#!/usr/bin/perl
use CGI qw(:standard);
use CGI::Carp qw(fatalsToBrowser);
# use strict;
use warnings;
# use diagnostics;
#use vars
# qw($fullname $anslength @allselections $file $fname $lname $time $r
+eviewtime $idinput $id $courselocation $useripaddress $questionno @lo
+g $clocktime $log $type $value @answers $buttonname %selections @opti
+ons);
my (
@explain, @allanswers, @allquestions, $fullname,
$anslength, @allselections, $file, $fname,
$lname, $time, $reviewtime, $idinput,
$id, $courselocation, $useripaddress, $questionno,
@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>";
# ******************* START SUBROUTINE MAKEEXAM
sub makeexam() {
local $/ = "~\n"; # ** CHANGES INPUT RECORD SEPARATOR TO ~line
+break
# ************************** THIS SECTION CREATES THE HTML FOR THE
+ EXAM.
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 . " "
. $clocktime . " "
. $useripaddress . " "
. $time . "\n";
close(ACCESS);
# ********************************** END SCRIPT TO RECORD ACCESS T
+O THE EXAM
print "<H2>Hello $fullname!</H2><P>";
print start_form (
-name => 'makequiz',
-method => 'POST',
-action => "http://ist221.nsm.tridenttech.edu/perl/grad
+equiz.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 $/ FROM EACH LINE
( $type, $value ) =
split( /:#\s*/, $_ ); # ***** SPLITS EACH LINE BY TYPE AN
+D 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 & PRINTS 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 SELECTION LINE
$buttonname = $type . $questionno;
push( @allselections, $value );
%selections = split( /`\s*/, $value );
@options = keys(%selections);
if ( $anslength > 1 ) { # ** DETERMINES TO USE RADIO OR
+ CHECKBOX
print "<BR>";
print checkbox_group(
-name => $buttonname,
-values => \@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 LIN
+E
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;
}
# ************************* END SUBROUTINE MAKEEXAM
print end_html;
makeexam();
print "The last element in the questions array is $#allquestions<p>";
| [reply] [d/l] |
You should probably work backwards. Following where you expect allquestions to get more items, and when you find that make sure it is working, if it isn't then back up another step until you get to the spot where something isn't happening that should be. If its your script and you uderstand it, you can always start at the begging and check that each case is happening as you expect it to. When you find that one variable or file that isn't behaving like you expect then give us that. It will help greatly.
| [reply] |
What more can I do?
You can try to narrow it down to a 5-6 line test case that shows us what isn't working like you expect. When you give us a 170 line chunk of code and say "fix this", it feels too much like we're doing your work without getting paid.
| [reply] |