# 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";