Listing 1

#!/usr/local/bin/perl5

# We want to use the CGI module
use CGI;

# Set the filename to which we want the elements saved
my $filename = "/home/reuven/Consulting/guestbook.html";

# Set the character that will separate fields in the file
my $separation_character = "</P><P>";

# In what order do we want to print fields?
my @fields = ("name", "email");

# Which fields are required?
my @required_fields = ("name", "email");

# What is the full name for each required field?
$FULLNAME{"name"} = "your full name";
$FULLNAME{"email"} = "your e-mail address";

# Create a new CGI object
my $query = new CGI;

# ------------------------------------------------------------
# Make sure that all required fields have arrived
foreach $field (@required_fields)
{
    # Add the name of each missing field
    push (@missing_fields, $field) if ($query->param($field) !~ m/\w/);
}

# If any fields are missing, invoke the error routine
&missing_field(@missing_fields) if @missing_fields;

# ------------------------------------------------------------
# Open the file for appending
open (FILE, ">>$filename") || &error_opening_file($filename);

# Grab the elements of the HTML form
@names = $query->param;

# Iterate through each element from the form, writing each element to
# $filename.  Separate elements with $separation_character defined
# above.
foreach $index (0 .. $#fields)
{
    # Get the input from the appropriate HTML form element
    $input = $query->param($fields[$index]);

    # Remove any instances of $separation_character
    $input =~ s/$separation_character//g;

    # Now add the input to the file
    print FILE $input;

    # Don't print the separation character after the final element
    print FILE $separation_character if ($index < $#fields);
}

# Print a newline after this user's entry
print FILE "<BR><HR><P>\n\n";

# Close the file
close (FILE);

# ------------------------------------------------------------
# Now thank the user for submitting their information

# Print an a appropriate MIME header
print $query->header("text/html");

# Print a title for the page
print $query->start_html(-title=>"Thank you");

# Print all of the name-value pairs
print "<P>Thank you for submitting the form.</P>\n";
print "<P>Your information has been saved to disk.</P>\n";

# Finish up the HTML
print $query->end_html;


# ------------------------------------------------------------
# Subroutines

sub missing_field
{
    # Get our local variables
    my (@missing_fields) = @_;

    # Print an a appropriate MIME header
    print $query->header("text/html");

    # Print a title for the page
    print $query->start_html(-title=>"Missing field(s)");

    print "<P>You are missing the following required
fields:</P>\n";
    print "<ul>\n";

    # Iterate through the missing fields, printing them
    foreach $field (@missing_fields)
    {
        print "<li> $FULLNAME{$field}\n";
    }

    print "</ul>\n";

    print "</ul>\n";

    # Finish up the HTML
    print $query->end_html;

    exit;
}


sub error_opening_file
{
    my ($filename) = @_;

    # Print an a appropriate MIME header
    print $query->header("text/html");

    # Print a title for the page
    print $query->start_html(-title=>"Error opening file");

    # Print the error
    print "Could not open the file \"$filename\".</P>\n";

    # Finish up the HTML
    print $query->end_html;

    exit;
}