Finally, we add a comment section so that students can complain about questions directly to their instructors rather than to the webmaster. The intention is that if there is something technically wrong with the question, the webmaster should fix it, while if there is something wrong with the content of the question, i.e., the physics or chemistry, then the teacher should be informed, since during a test, the student needs to explain what he or she is doing, and why.
#!/usr/local/bin/perl -- -*-perl-*-
use CGI;
$query = new CGI;
print $query->header;
print $query->start_html('Prototype Question_4-Logging&Commenting');
require  "CleanUp.pl";
require  "explain.pl";
require  "count.pl";
require  "reports.pl";
srand;

$scriptname = $query->script_name();#this gives the question name
#print $query->dump;#use this to check that it worked! Just remove comment(#).

print "Anonymous access to the <a href=test_send_memo.pl?var=$scriptname>webmaster to send a message concerning errors in this question</a>
is available here.<br>";

# this question was called via html?owner=Jones&name=SomeOne
#$faculty_id = $query->param('faculty');
#$student_id = $query->param('student');
#print "<br>FACULTY(owner) = ",$query->param('owner'),", STUDENT(owner) = ",$query->param('name'),"<br>";

print "<a href=http://mmedia.ucc.uconn.edu/~cdavid//notation/notation.html>Click here to get a notation explanation</a>";
#print $query->dump;
print "<hr>";
&count($scriptname);
print "<hr>";
print $query->start_form;
print $query->hidden('faculty',$query->param('owner'));
print $query->hidden('student',$query->param('name'));
#print $query->dump;
$faculty_id = $query->param('faculty');
$student_id = $query->param('student');
print <<EOF;
This is teacher created text concerning this particular question.
Without explicit print statements, it must be entered using a
special format.
EOF
print "<br>Answer = ",$query->textfield('ans','',50,80);
print"<P> Query, is the above formula/number correct?",$query->submit;
print $query->end_form;
print "<hr>";
print $query->start_form;
print $query->hidden('faculty',$query->param('owner'));
print $query->hidden('student',$query->param('name'));
#print $query->dump;
$faculty_id = $query->param('faculty');
$student_id = $query->param('student');
print "If you wish to comment to your <em>instructor</em> about
this question, assumptions you are making, inconsistencies in the
phraseology of the question, objections to the question, etc., etc., etc.,
you may use this space for that purpose.";
print "Nothing entered here will go to the webmaster, instead, it will
go to your instructor!";
print $query->textarea('comments','',10,60);
print "<br>";
print $query->submit('Submit2','Send the comment');
print $query->reset;
print $query->end_form;

if ($query->param('comments') ne '') {
	open (FACULTY,">>/home/cdavid/public_html/Master_teacher.dat")||die print 
		"<br> Master_teacher.dat, Faculty File Troubles Encountered, please report to instructor";
	$comments = $query->param('comments');
	print FACULTY "<",$faculty_id,">,<",$student_id,">, comments=",$comments,"
";
	close(FACULTY);
}

if ( $query->param('ans') ne '')
{
$faculty_id = $query->param('faculty');
$student_id = $query->param('student');
#print $query->dump;
#print "<br>student_id = ",$student_id;
$stu_ans = $query->param('ans');
$saved_stu_ans = $stu_ans;
&CleanUp($stu_ans);#this removes potential hacker imbedded illegal commands
$ans = "sqrt(4/x)"; 
$saved_ans = $ans;
$x = rand;
$ans =~s/x/$x/gi;
$stu_ans =~s/x/$x/gi;
print "student_answer = $saved_stu_ans";
$stu_ans = eval($stu_ans);
$ans =  eval($ans);
#print "student_answer  = $stu_ans <p>";
#print "student_answer evaluated = $stu_ans<p>";
#print "answer evaluated = $ans <p>";
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
if (eval (($stu_ans - $ans)**2 - 0.0001  ) ge 0.0 ) {
	&reportstudent($faculty_id,$student_id,$saved_stu_ans,$saved_ans,$scriptname);	
	&reportfaculty($faculty_id,$student_id,$saved_stu_ans,$saved_ans,$scriptname);	
print ", <EM> Wrong</EM>,
	<IMG SRC=../icons/checkno.gif>"}
 else {print ", <EM> Right! </EM>,
	<IMG SRC=../icons/check.gif>" ;
	&reportfaculty_right($faculty_id,$student_id,$saved_stu_ans,$saved_ans,$scriptname);	
print "<a href=proto_4_h.pl>Help is available for this question<br></a>";
	}
};

print $query->end_html;
To try this out, click here and then look at `Master_teacher.dat' in the public_html directory. In this example, the question is being called with a teacher name = `Teacher_name' and a student name = `Student_name', and you will see in `Master_teacher.dat' that whatever message you entered is recorded there, and whatever answer you gave is recorded there, with the appropriate identifiers.

One last thing, we have added a help call for the wrong answer section, so that students always have the ability to ask for help if they get a question wrong. Commenting out this call will prevent it, but it is better to have it in the prototype than not (to have it).