Listing 1. The Script

#!/usr/bin/perl

use CGI qw(:standard);

my $infile = 'maintenance.txt';
my $mileage_range = "10000"; # Only show entries within this range

if(param())
{
   $requestType = param("requestType");
   $serviceId = param("serviceId");
   $point = param("point");
   $count = param("count");
   $offset = param("offset");
   $sort = param("sort");
   $signature = param("signature");
   $mileage = param("q");
   my %hash;
   my $items = 0;

   parse_infile($infile, \%hash);

   foreach (sort keys %hash){
      if(abs($_ - $mileage) < $mileage_range){
         next if($hash{$_}{'c'} == 1);

         $delta = $_ - $mileage;
         if($delta >= 0){
            $title = "$_ - $hash{$_}{'desc'}";
            $desc = "<![CDATA[<html>In <b>$delta</b>
 ↪miles:<br>$hash{$_}{'desc'}</html>]]>";
         }
         else {
            $title = "PAST DUE: $hash{$_}{'desc'}";
            $desc = "<![CDATA[<html><font color=#FF0000>
  ↪<b>" . abs($delta) . "</b> miles <i>PAST DUE</i>
  ↪</font>:<br>$hash{$_}{'desc'}</html>]]>";
         }

         $output .= output_result($title, $desc);
         $items++;
      }
   }

   print header('text/xml');
   print '<?xml version="1.0" encoding="UTF-8"?>'
            . "\n<resultSet>"
            . "<serviceId>$serviceId</serviceId>"
            . "<count>$items</count>";

   print $output;
   print '</resultSet>';
   exit;
}

sub output_result {
   my $title = shift;
   my $desc = shift;
   my $output;

   $output =  "\n<result>"
            . "<title>$title</title>"
            . "<description>$desc</description>"
            . '</result>';

   return $output;
}

sub parse_infile {
   my $infile = shift;
   my $href = shift;
   my ($mileage, $desc, $completed);

   open INFILE, $infile or die "Can't open $infile: $!\n";
   while(<INFILE>){
      chomp;
      $mileage = $desc = $completed = "";
      ($mileage, $desc, $completed) = split ',', $_;
      $$href{$mileage}{'desc'} = $desc;
      $$href{$mileage}{'c'} = $completed;
   }
   close INFILE;
}