|
#*********
BEGIN BODY********************
open(LOGFILE, "<guestbook.log");
@entries = <LOGFILE>;
close LOGFILE;
print "<BODY bgcolor=beige>\n";
print "<TABLE>\n";
foreach $line (@entries) {
@fields = split(/::/,$line);
print "<TR><TD>$fields[0]
$fields[1]<TD>$fields[9]\n";
};
print "</TABLE>\n";
#********* END BODY********************
Copy this script to the BODY of the template.txt file.
Save it as getlog.cgi,
Use your FTP program to upload getlog.cgi to the perltour
folder on the server. (Ascii transfer only)
Switch to a Unix prompt, be sure you are in the perltour folder,
and type chmod a+rx getlog.cgi
Point your browser to http://your.server.name/perltour/getlog.cgi
The screen should turn beige and display a list of all the
people and comments you have entered.
This script is almost exactly the reverse of the previous script.
The guestbook.cgi script on the previous page would get text from the page,
combine it into one long line, and add it to guestbook.log. This
script will get a line of text from the guestbook.log file, parse it into
individual values, and display them on the screen. I chose to display
only the name and comments for this first example. It is easier to
read this way.
open(LOGFILE, "<guestbook.log");
The first line of this script is the same as the first line of the
last script, with one important difference. Remember the 2 greater-than
signs in the last open statement? This time we are using just
1 less-than sign, indicating that the file is being opened for input.
LOGFILE will again be the file handle, so from now on, LOGFILE means "input
from guestbook.log."
@entries = <LOGFILE>;
This is a really cool command. It creates an array called @entries.
Each line in the file, LOGFILE (therefore, each line in our guestbook)
is an entry in the array. If I were now to execute this command
print "$entries[0]"
then the first line of guestbook would appear.
IMPORTANT: Notice that when I refer to an entire array I use the @
sign, but when I want
just one value I use the $ sign. So I could write:
@fruit = ('apples','pears','grapes');
To get the second value from the array @fruit, I would type this:
print $fruit[1];
print "<BODY bgcolor=beige>\n";
print "<TABLE>\n";
Just some HTML to set the mood. The background will now be beige,
and we are ready to start writing rows and data to our table. By
the way, I didn't have to add a newline (\n) to the end of the HTML tags.
As you know, HTML doesn't care whether you type the source code on 1 line
or 50. This will make the page easier to proofread, however, if for
some reason we should want to view the page source.
foreach $line (@entries) {
This is another very nice feature in Perl. The foreach command
is a special loop just for arrays. It will run once for each value
in @entries. Each time it runs the loop, it will assign the
next value in @entries to the variable $line.
So the first time throught the loop $line will be equal to the
first value in @entries (the first line of our guestbook).
Then the next time through the loop, $line will be equal to the
second value (the second line of our guestbook). It will automatically
stop when it reaches the end of @entries.
@fields = split(/::/,$line);
The split command is one of the most useful special tools in
Perl. It will split a value into two or more pieces, and store each
piece in an array. In our situation, we stored 10 values on each
line, seperated by 9 double colons (::). A typical line looked
like this.
Robert::Young::5 Main St.::Anytown::MA::02177::(617)
555-1212::robyoung@mediaone.net::on::This page is great!
The split command would locate the double colons, split the line
into 10 seperate values, and stack them each to the array @fields.
Now, I can analyze my data, because
$fields[0] = Robert
$fields[1] = Young
$fields[2] = 5 Main St.
etc.
print "<TR><TD>$fields[0] $fields[1]<TD>$fields[9]\n";
}
If I wanted to print out the entire line, I could have typed this:
foreach $value (@fields) {
print "<TD>$value";
};
The entire line is too big for most screens, however, and the wrapping
looks ugly in narrow HTML tables. Instead, I chose to print only
the first and last name in one cell, and the comments in another.
We can easily create another CGI for the address, phone, and e-mail.
print "</TABLE>\n";
Now that we have written a <TR> table row for each line in the guestbook,
it is time to close the
<TABLE> tag.
That's it. Now, since this CGI does not need an user information,
it does not need to be the ACTION element of a form. You can
create a link to getlog.cgi the same way you would create a link
to any other page. You can even bookmark it.
|