# checkmath.pl # This script reads in a series of arithmetic statments, # and checks whether they are correct # It is extremely limited, in that it only handles statements with 2 operands $input_file = "math.txt"; open (INFILE, $input_file) or die "Can't open input file: $!\n"; $correct_answers = 0; $incorrect_answers = 0; CHECK_ANSWER: while ($line = ) { chomp($line); # We'll assume that statements have the form: # x OPERATION y = z # So, let's first start by getting the left sides and result. # We can split at the equal sign (removing also any spaces around it ($operation, $given_answer) = split(/\s*=\s*/,$line); # Now, the trick is to parse out the operation, so we can check it # We want to split at a +, -, * or / # Since these are all "special" symbols in regular expression syntax, # we need to "protect" them by putting a backslash before each. # As before, we also include the spaces (\s*) as part of the delimiter @operands = split(/\s*[\+\-\*\/]\s*/, $operation); if ($operation =~ /\+/) { $operator = "plus"; $real_answer = $operands[0] + $operands[1]; } elsif ($operation =~ /\-/) { $operator = "minus"; $real_answer = $operands[0] - $operands[1]; } elsif ($operation =~ /\*/) { $operator = "times"; $real_answer = $operands[0] * $operands[1]; } elsif ($operation =~ /\//) { $operator = "divided by"; $real_answer = $operands[0] / $operands[1]; } else { # If we got here, there was no +, -, *, or / found print "Error! The operation $operation was not found to have an operator\n"; next CHECK_ANSWER; } if ($real_answer == $given_answer) { $correct = 1; $correct_answers++; } else { $correct = 0; $incorrect_answers++; } print "$operands[0] $operator $operands[1] is $real_answer\t"; print "\t(The given answer of $given_answer is "; unless ($correct) { print "NOT "; } print "correct)\n"; } # We are now done with the file, and can calculate summary statistics. print "\nTotal of $correct_answers correct answers, and $incorrect_answers incorrect answers.\n"; print "\t(Overall score: " . ($correct_answers * 100 / ($correct_answers + $incorrect_answers))." percent)\n";