[11911] in Perl-Users-Digest
Perl-Users Digest, Issue: 5511 Volume: 8
daemon@ATHENA.MIT.EDU (Perl-Users Digest)
Wed Apr 28 19:07:20 1999
Date: Wed, 28 Apr 99 16:01:19 -0700
From: Perl-Users Digest <Perl-Users-Request@ruby.OCE.ORST.EDU>
To: Perl-Users@ruby.OCE.ORST.EDU (Perl-Users Digest)
Perl-Users Digest Wed, 28 Apr 1999 Volume: 8 Number: 5511
Today's topics:
Help! - Trouble with CGI script written in Perl. <pizdobol@hotmail.com>
Re: How do i print something using perl? (Bart Lateur)
How do you send an attachment using MIME::Entity? (Knowledge Depot)
Re: Invalid Header ? <t-armbruster@ti.com>
Learning Perl <info@itte.org>
Re: MIME::Tools and recommended filename tiwason@my-dejanews.com
Re: MQSeries.pm <t-armbruster@ti.com>
Re: problem (Alastair)
Re: Quotes question?? (Sean McAfee)
Special: Digest Administrivia (Last modified: 12 Dec 98 (Perl-Users-Digest Admin)
----------------------------------------------------------------------
Date: Wed, 28 Apr 1999 18:38:11 -0400
From: "Pizdobol" <pizdobol@hotmail.com>
Subject: Help! - Trouble with CGI script written in Perl.
Message-Id: <37278de3.0@lightning.ica.net>
Hello there,
I have tried my best for many hours to make this script work, but It still
doesn't run. ;(
Can anybody take a fresh look at it and help me to determine what is
actually wrong with it?
Thank you in advance.
<-start->
#!/usr/local/bin/perl
# Set Variables
# 'mesgFile' is located in this dir
# IMPORTANT: 'chmod 600 mesgFile'
$baseDir = "../../guestbook";
$baseUrl = "http://www.mysite.com;
$cgiurl = "$baseUrl/cgi-bin/gb/feedback.pl";
$mesgFile = "$baseDir/entries.txt";
$mailProg = '/usr/lib/sendmail -t';
$recipient = 'webmaster@mysite.COM';
$recipientName = 'me';
$allowHtml = 1; # 1 = Yes; 0 = No
# Done Editing! #
############################################################################
#
# Retrieve Date
############################################################################
#
&getDate;
$query = $ENV{'QUERY_STRING'};
$command = '';
$page = 1;
$USER = '';
$PWD = '';
if ($query) {
if ($query =~ /&/) {
@queryString = split(/&/,$query);
foreach $qString (@queryString) {
if ($qString =~ m/Page=(\d+)/) {
$page = $1;
}
elsif ($qString =~ m/User=(.*)/) {
$USER = $1;
}
elsif ($qString =~ m/Pwd=(.*)/) {
$PWD = $1;
}
else {
$command = $qString;
}
}
}
elsif ($query =~ /Page=(\d+)/) {
$page = $1;
}
else {
$command = $query;
}
}
else {
&parseForm;
}
############################################################################
#
# Remove
# Using this method allows you to delete all messages posted before
# a certain date.
############################################################################
#
if ($command eq 'Remove') {
&header('<title>Remove Unwanted Entries From Your Suggestion
Box</title>');
print " <center>\n";
print " <h1>Remove Unwanted Entries</h1>\n";
print " Select entries you wish to remove an then click the button
below.<br>\n";
print " You may also delete IPs in a similar manner.<br>\n";
print " (It's possible to delete/ban multiple entries)\n";
print " </center>\n";
print " <form method=post action=\"$cgiurl\">\n";
print " <input type=hidden name=action value=Remove>\n";
print " <input type=hidden name=USER value=\"$USER\">\n";
print " <input type=hidden name=PWD value=\"$PWD\">\n";
open(MESG,"$mesgFile") || &error(mesgFile);
@lines = <MESG>;
$size = @lines;
close(MESG);
#Number,IP,Name,URL,URL,Date,Comments
$totalPage = int(($size-3)/10 + .95);
$totalPage = 1 unless ($totalPage > 0);
if ($page > $totalPage) {
$page = 1;
}
$pageEntryMin = ($page-1)*10;
$pageEntryMax = ($page*10)+1;
$entry = -3; # Init to -3, since 3 starter lines
print " <table width=\"100%\"><tr>\n";
print " <td width=\"25%\" align=center><hr noshade size=4></td>\n";
$entryPlural = "Entr" . ($size-3 != 1 ? "ies" : "y");
$pagePlural = "Page" . ($totalPage != 1 ? "s" : "");
print " <td width=\"50%\" align=center>Info: ",$size-3," $entryPlural on
$totalPage $pagePlural · Current Page: $page</td>\n";
print " <td width=\"25%\" align=center><hr noshade size=4></td>\n";
print " </tr></table><p>\n";
print " <table width=\"100%\">\n";
foreach $line (@lines) {
$entry++;
next if ($line =~ m/<!--Name\/Pwd: (.*):(.*)-->/);
next if ($line =~ m/<!--Restrict IP: (.*)-->/);
next if ($line =~ m/<!--Add Here: (\d+)-->/);
next if (($entry<=$pageEntryMin) || ($entry>=$pageEntryMax));
@entry = split(/\cR/, $line);
$EntryNumber{$line} = $entry[0];
$IP{$line} = $entry[1];
$Name{$line} = $entry[2];
$EMail{$line} = $entry[3];
$URL{$line} = $entry[4];
$referrer{$line} = $entry[5];
$city{$line} = $entry[6];
$country{$line} = $entry[7];
$Date{$line} = $entry[8];
$Comments{$line} = $entry[9];
print " <tr>\n";
print " <td align=center valign=top><input type=checkbox
name=remove$EntryNumber{$line} value=$EntryNumber{$line}><br></td>\n";
print " <td>\n";
if ($EMail{$line}) {
print "<B>Name: </B>\n";
print "<b><a href=\"mailto:$EMail{$line}\">$Name{$line}</a> (<input
type=checkbox name=ban$EntryNumber{$line} value=$IP{$line}>IP:
$IP{$line})</b><br>\n";
}
else {
print "<B>Name: </B>\n";
print "<b>$Name{$line}</b>\n";
if ($URL{$line}) {
print "<B>Website: </B>\n";
print "<b><a href=\"$URL{$line}\">$URL{$line}</a></b><br>\n";
}
else {
print "<br>\n";
}
if ($referrer{$line}) {
print "<B>Referred by: </B>\n";
print "<b>$referrer{$line}</b><br>\n";
}
else {
print "<br>\n";
}
if ($city{$line}) {
print "<B>From: </B>\n";
print "<b>$city{$line} ,</b>\n";
}
else {
print "<br>\n";
}
if ($country{$line}) {
print "<b>$country{$line}<br></b>\n";
}
else {
print "<br>\n";
}
print "<br>\n";
print "<b>$Date{$line}<b>\n";
print "<b>Comments: </B><BLOCKQUOTE>\n";
print "$Comments{$line}\n";
print "</BLOCKQUOTE>\n";
print " </td>\n";
print " </tr>\n";
push(@usedValues,$EntryNumber{$line});
}
print " </table>\n";
print " <input type=hidden name=usedValues value=\"@usedValues\">\n";
print " <center>\n";
print " <table width=\"100%\"><tr>\n";
if (($totalPage<=1) || ($page==1)) {
print " <td>Previous Page</td>\n";
}
else {
print " <td>Previous Page<input type=radio name=prevNext
value=",$page-1,"></td>\n";
}
print " <td align=center>\n";
print " <input type=submit value=\"Process Information\">\n";
print " <input type=reset value=\"Clear Form\">\n";
print " </td>\n";
if (($totalPage<=1) || ($page==$totalPage)) {
print " <td align=right>Next Page</td>\n";
}
else {
print " <td align=right><input type=radio name=prevNext
value=",$page+1,">Next Page</td>\n";
}
print " </tr></table>\n";
print " <p><hr noshade size=4><br>\n";
print " [<a href=\"$cgiurl\?Page=1\">Suggestion Box</a>] [<a
href=\"$cgiurl\?Supervisor\">Supervisor's Page</a>]\n";
print " </center>\n";
print " </form>\n";
print "</body>\n";
print "</html>\n";
exit;
}
############################################################################
#
# Remove Action
# This portion is used by the method remove
############################################################################
#
elsif ($FORM{'action'} eq 'Remove') {
&checkPasswd;
@usedValues = split(/\s/,$FORM{'usedValues'});
foreach $usedValue (@usedValues) {
if ($FORM{'remove'.$usedValue}) {
push(@REMOVE, $usedValue);
}
if ($FORM{'ban'.$usedValue}) {
push(@BAN, $FORM{'ban'.$usedValue});
}
}
open(MESG,"$mesgFile") || &error(mesgFile);
@lines = <MESG>;
close(MESG);
foreach $line (@lines) {
next if ($line =~ m/<!--Name\/Pwd: (.*):(.*)-->/);
if ($line =~ m/<!--Restrict IP: (.*)-->/) {
$curIPs = $1;
foreach $single (@BAN) {
$curIPs .= ','.$single;
}
$line = '<!--Restrict IP: '.$curIPs."-->\n";
$line =~ s/ ,/ /g;
}
next if ($line =~ m/<!--Add Here: (\d+)-->/);
@TempData = split(/\cR/, $line);
foreach $single (@REMOVE) {
if ($TempData[0] eq "$single") {
$line = '';
}
}
}
open(MESG,">$mesgFile") || &error(noEntryChange);
print MESG @lines;
close(MESG);
&returnHtml(Remove);
}
############################################################################
#
# IP Editing
############################################################################
#
elsif ($command eq 'IPAccess') {
&header('Ban/Unban IP Addresses From Your Suggestion Box');
print " <center>\n";
print " <h1>Ban/UnBan IP Addresses</h1>\n";
print " <p>Bans a given site from future access to the Feedback
Form/Suggestion Box.<br>\n";
print " The IP address can be specified in the form of x.x.x.x to ban a
specific machine,<br>\n";
print " or as x.x. or x.x.x. to ban an entire domain or subnet.\n";
print " <p><hr noshade size=4><br>\n";
print " <form method=post action=\"$cgiurl\">\n";
print " <input type=hidden name=action value=IPAccess>\n";
print " <input type=hidden name=USER value=\"$USER\">\n";
print " <input type=hidden name=PWD value=\"$PWD\">\n";
print " <table border=4 cellpadding=0 cellspacing=0 width=\"75%\">\n";
print " <tr>\n";
print " <th><br>Ban<p></th>\n";
print " <th>UnBan</th>\n";
print " <th>IP Address</th>\n";
print " </tr>\n";
open(MESG,"$mesgFile") || &error(mesgFile);
@ipLines = <MESG>;
close(MESG);
$lineNum = 0;
foreach $line (@ipLines) {
if ($line =~ m/<!--Restrict IP: (.*)-->/) {
@IPs = split(/,/, $1);
@sortedIPs = (sort { $a <=> $b } @IPs);
foreach $ipEntry (@sortedIPs) {
$lineNum++;
print " <tr>\n";
print " <td> </td>\n";
print " <td align=center><input type=checkbox name=unban$lineNum
value=$ipEntry></td>\n";
print " <td align=center>$ipEntry</td>\n";
print " </tr>\n";
push(@usedFormValues,$ipEntry);
}
}
}
print " <tr>\n";
print " <td align=center>x</td>\n";
print " <td> </td>\n";
print " <td align=center><input type=text name=ban size=15
maxlength=15></td>\n";
print " </tr>\n";
print " <tr>\n";
print " <td align=center colspan=3>\n";
print " <br><input type=submit value=\"Process Information\">\n";
print " <input type=reset value=\"Clear Form\"><p>\n";
print " </td>\n";
print " </tr>\n";
print " </table>\n";
print " <input type=hidden name=usedValues
value=\"@usedFormValues\">\n";
print " </form>\n";
print " <p><hr noshade size=4><br>\n";
print " [<a href=\"$cgiurl\?Page=1\">Suggestion Box</a>] [<a
href=\"$cgiurl\?Supervisor\">Supervisor's Page</a>]\n";
print " </center>\n";
print " <p><center><font size=1>Online Administrative Feedback Form script
created by <a href=\"http://Pages.NYU.EDU/~rw263/\">Randy Jae
Weinstein</a></font></center>\n\n";
print "</body>\n";
print "</html>\n";
exit;
}
############################################################################
#
# IPAccess Action
############################################################################
#
elsif ($FORM{'action'} eq 'IPAccess') {
&checkPasswd;
@usedValues = split(/\s/,$FORM{'usedValues'});
$lineNum = 0;
foreach $usedValue (@usedValues) {
$lineNum++;
if ($FORM{'unban'.$lineNum}) {
push(@IP, $usedValue);
}
}
open(MESG,"$mesgFile") || &error(mesgFile);
@IPs = <MESG>;
close(MESG);
foreach $line (@IPs) {
if ($line =~ m/<!--Restrict IP: (.*)-->/) {
$curIPs = $1;
foreach $ip (@IP) {
$curIPs =~ s/$ip//;
}
$line = '<!--Restrict IP: '.$curIPs."-->\n";
if ($FORM{'ban'})
if (($FORM{'ban'} =~ /(\d+)\.(\d+)\./) ||
($FORM{'ban'} =~ /(\d+)\.(\d+)\.(\d+)\./) ||
($FORM{'ban'} =~ /(\d+)\.(\d+)\.(\d+)\.(\d+)/)) {
$line = '<!--Restrict IP: '.$curIPs.','.$FORM{'ban'}."-->\n";
}
}
$line =~ s/ ,/ /g;
$line =~ s/,,/,/g;
$line =~ s/,-/-/;
}
}
open(MESG,">$mesgFile") || &error(noEntryChange);
print MESG @IPs;
close(MESG);
&returnHtml(IPAccess);
}
############################################################################
#
# Change Password
# By calling this section of the script, the admin can change his or
# her password.
############################################################################
#
elsif ($command eq 'changePassword') {
&header('Change Admin Password');
print " <center>\n";
print " <h1>Change Admin Password</h1>\n";
print " Fill out the form below completely to change your password and
user name.<br>\n";
print " If new username is left blank, your old one will be assumed.\n";
print " <p><hr noshade size=4><p>\n";
print " <form method=post action=\"$cgiurl\">\n";
print " <input type=hidden name=action value=changePassword>\n";
print " <input type=hidden name=USER value=\"$USER\">\n";
print " <input type=hidden name=PWD value=\"$PWD\">\n";
print " <table border=0>\n";
print " <tr>\n";
print " <th align=left>New Username: </th>\n";
print " <td><input type=text name=newUsername size=15
maxlength=15><br></td>\n";
print " </tr>\n";
print " <tr>\n";
print " <th align=left>New Password: </th>\n";
print " <td><input type=password name=passwd1 size=15
maxlength=15><br></td>\n";
print " </tr>\n";
print " <tr>\n";
print " <th align=left>Re-type New Password: </th>\n";
print " <td><input type=password name=passwd2 size=15
maxlength=15><br></td>\n";
print " </tr>\n";
print " <tr>\n";
print " <td align=center colspan=2>\n";
print " <br><input type=submit value=\"Process Information\">\n";
print " <input type=reset value=\"Clear Form\">\n";
print " </td>\n";
print " </tr>\n";
print " </table>\n";
print " </form>\n";
print " <p><hr noshade size=4><br>\n";
print " [<a href=\"$cgiurl\?Page=1\">Suggestion Box</a>] [<a
href=\"$cgiurl\?Supervisor\">Supervisor's Page</a>]\n";
print " </center>\n";
print " <p><center><font size=1>Online Administrative Feedback Form script
created by <a href=\"http://Pages.NYU.EDU/~rw263/\">Randy Jae
Weinstein</a></font></center>\n\n";
print "</body>\n";
print "</html>\n";
exit;
}
############################################################################
#
# Change Password
############################################################################
#
elsif ($FORM{'action'} eq 'changePassword') {
open(MESG,"$mesgFile") || &error(mesgFile);
@passwdLines = <MESG>;
close(MESG);
foreach $line (@passwdLines) {
if ($line =~ m/<!--Name\/Pwd: (.*):(.*)-->/)
$username = $1;
$passwd = $2;
srand(time ^ $$); # random seed
@saltchars = ('a'..'z','A'..'Z',0..9,'.','/'); # valid salt chars
$salt = $saltchars[int(rand($#saltchars+1))]; # first random salt
char
$salt .= $saltchars[int(rand($#saltchars+1))]; # second random salt
char
$newPasswd = crypt($FORM{'passwd1'}, $salt);
if ($FORM{'newUsername'}) {
$newUsername = $FORM{'newUsername'};
}
else {
$newUsername = $FORM{'USER'};
}
$line =~ s/$username:$passwd/$newUsername:$newPasswd/;
}
}
if (($FORM{'passwd1'} ne $FORM{'passwd2'}) ||
(length($FORM{'passwd1'})<5)) {
&error(notSame);
}
if (($FORM{'PWD'} eq $passwd) && ($FORM{'USER'} eq $username)) {
open(PASSWD,">$mesgFile") || &error(noPasswdChange);
print PASSWD @passwdLines;
close(PASSWD);
}
else {
&error(badCombo);
}
&returnHtml(changePassword);
}
############################################################################
###
# Enter Password
############################################################################
###
elsif ($FORM{'action'} eq 'enterPasswd') {
open(MESG,"$mesgFile") || &error(mesgFile);
@passwdLines = <MESG>;
close(MESG);
foreach $line (@passwdLines) {
if ($line =~ m/<!--Name\/Pwd: (.*):(.*)-->/)
$username = $1;
$passwd = $2;
}
}
if ($FORM{'USER'} && $FORM{'PWD'}) {
if (!(($FORM{'PWD'} eq $passwd) && ($FORM{'USER'} eq $username))) {
&error(badCombo);
}
}
else {
$testPasswd = crypt($FORM{'password'}, substr($passwd, 0, 2));
if (!(($testPasswd eq $passwd) && ($FORM{'username'} eq $username))) {
&error(badCombo);
}
}
$USER = $username;
$PWD = $testPasswd;
&returnHtml(enterPasswd);
}
############################################################################
#
# Wants to goto Admin Options
############################################################################
#
elsif ($command eq 'Supervisor') {
&header('Supervisor Page');
print " <center>\n";
print " <h1>Supervisor Page</h1>\n";
print " <p><hr noshade size=4><p>\n";
print " <form method=post action=\"$cgiurl\">\n";
print " <input type=hidden name=action value=enterPasswd>\n";
print " <table border=0>\n";
print " <tr>\n";
print " <th>Username: <input type=text name=username size=15
maxlength=15></th>\n";
print " </tr>\n";
print " <tr>\n";
print " <th>Password: <input type=password name=password size=15
maxlength=15><p></th>\n";
print " </tr>\n";
print " <tr>\n";
print " <td>\n";
print " <input type=radio name=command value=IPAccess>Ban/UnBan
IPs<p>\n";
print " <input type=radio name=command value=changePassword>Change
Admin Password<p>\n";
print " <input type=radio name=command value=Remove>Remove Entries
from Suggestion Box<p>\n";
print " </td>\n";
print " </tr>\n";
print " <tr>\n";
print " <td align=center>\n";
print " <input type=submit value=\"Process Information\">\n";
print " <input type=reset value=\"Clear Form\">\n";
print " </td>\n";
print " </tr>\n";
print " </table>\n";
print " </form>\n";
print " <p><hr noshade size=4><br>\n";
print " [<a href=\"$cgiurl\?Page=1\">Suggestion Box</a>]\n";
print " </center>\n";
print " <p><center><font size=1>Online Administrative Feedback Form script
created by <a href=\"http://Pages.NYU.EDU/~rw263/\">Randy Jae
Weinstein</a></font></center>\n\n";
print "</body>\n";
print "</html>\n";
exit;
}
############################################################################
#
# Print out a nice header. Will prob change for every Feedback Form
############################################################################
#
elsif ($command eq 'Feedback') {
&getAccess;
&header('Feedback Form');
print <<FeedbackForm;
<CENTER><font color="#0000FF">
<H2>bEOILU A VM_PEAQW ILUVQ ! </H2></font>
</CENTER>
<p><img src="../../images/silvbar.gif" width="100%" height="15"></p>
<form METHOD="POST" ACTION="$cgiurl">
<input type=hidden name=action value=add>
<div align="center"><center><table border="2">
<tr>
<th ALIGN="left">uKZ:</th>
<td><input TYPE="text" NAME="Name" SIZE="40"
VALUE="$FORM{'Name'}"></td>
</tr>
<tr>
<th ALIGN="left">E-Mail:</th>
<td><input TYPE="text" NAME="EMail" SIZE="40"
VALUE="$FORM{'EMail'}"></td>
</tr>
<tr>
<th ALIGN="left">Homepage URL (E_JU E_P]):</th>
<td><input TYPE="text" NAME="URL" SIZE="40"
VALUE="http://$FORM{'URL'}"></td>
</tr>
<tr>
<th ALIGN="left">i^I _WD^ C^@OEJ?:</th>
<td><input TYPE="text" NAME="referrer" SIZE="40"
VALUE="$FORM{'referrer'}"></td>
</tr>
<tr>
<th ALIGN="left">vMOMD:</th>
<td><input TYPE="text" NAME="city" SIZE="15"
VALUE="$FORM{'city'}"></td>
</tr>
<tr>
<th ALIGN="left">PO^L^:</th>
<td><input TYPE="text" NAME="country" SIZE="15"
VALUE="$FORM{'country'}"></td>
</tr>
<tr>
<th ALIGN="left">Comments:</th>
<td><textarea NAME="comments" COLS="40" ROWS="15">
$FORM{'comments'}
</textarea></td>
</tr>
<tr>
<td align="center"><input TYPE="submit" VALUE="Sign Guestbook"></td>
<td align="center"><input TYPE="reset"></td>
</tr>
</table>
</center></div>
</form>
<p align="center"><a href="$cgiurl\?Page=1">Back to the Guestbook
Entries</a></p>
<!-- p align="center"><a
href="$cgiurl\?Supervisor">Administration</a></p -->
</BODY>
</HTML>
FeedbackForm
exit;
}
############################################################################
#
# Add to Suggestion Box
############################################################################
#
elsif ($FORM{'action'} eq 'add') {
&getAccess;
# Print the Blank Response Subroutines
&noNameOrNoComment unless $FORM{'Comments'};
&noNameOrNoComment unless $FORM{'Name'};
# Begin the Editing of the Guestbook File
open(MESG,"$mesgFile") || &error(mesgFile);
@lines = <MESG>;
close(MESG);
$size = @lines;
if (!(&checkEmail($FORM{'EMail'}))) {
$FORM{'EMail'} = "";
}
if ($FORM{'URL'} eq 'http://' || $FORM{'URL'} !~ /^(f|ht)tp:\/\/\w+\.\w+/)
{
$FORM{'URL'} = "";
}
# Open Link File to Output
open(MESG,">$mesgFile") || &error(noEntryChange);
for ($i=0; $i<=$size; $i++) {
$_ = $lines[$i];
if (/<!--Add Here: (\d+)-->/)
$EntryNumber = $1;
$EntryNumber++;
print MESG "<!--Add Here: $EntryNumber-->\n";
print MESG
"$EntryNumber\cR$ENV{'REMOTE_ADDR'}\cR$FORM{'Name'}\cR$FORM{'EMail'}\cR$FORM
{'URL'}\cR$FORM{'referrer'}\cR$FORM{'city'}\cR$FORM{'country'}\cR$date\cR$FO
RM{'Comments'}\n";
}
else {
print MESG $_;
}
}
close (MESG);
# Print Out Thank You message
&thankYou;
}
############################################################################
#
# Actual Suggestion Box
############################################################################
#
else {
&getAccess;
open(MESG,"$mesgFile") || &error(mesgFile);
@lines = <MESG>;
close(MESG);
$size = @lines;
$totalPage = int(($size-3)/10 + .95);
$totalPage = 1 unless ($totalPage > 0);
if ($page > $totalPage) {
$page = 1;
}
$pageEntryMin = ($page-1)*10;
$pageEntryMax = ($page*10)+1;
$entry = -3; # Init to -3, since 3 starter lines
$entryPlural = "Entr" . ($size-3 != 1 ? "ies" : "y");
$pagePlural = "Page" . ($totalPage != 1 ? "s" : "");
&header('Suggestion Box');
print " <h3 align=\"center\">BRATVA Common Sites, Inc. Guestbook</h3>\n";
print " <p align=\"center\"><a href=\"$cgiurl\?Feedback\">bEOILU</a> A
VM_PEAQW ILUVQ!</p>\n";
print " <p><img src=\"../images/silvbar.gif\" width=\"100%\"
height=\"15\"></p>\n";
print " <p align=\"center\"><font size=\"2\">Info: ",$size-3,"
$entryPlural on $totalPage $pagePlural · Current Page: $page\n";
print " </font></p>\n";
foreach $line (@lines) {
$entry++;
next if ($line =~ m/<!--Name\/Pwd: (.*):(.*)-->/);
next if ($line =~ m/<!--Restrict IP: (.*)-->/);
next if ($line =~ m/<!--Add Here: (\d+)-->/);
next if (($entry<=$pageEntryMin) || ($entry>=$pageEntryMax));
@entry = split(/\cR/, $line);
$EntryNumber{$line} = $entry[0];
$IP{$line} = $entry[1];
$Name{$line} = $entry[2];
$EMail{$line} = $entry[3];
$URL{$line} = $entry[4];
$referrer{$line} = $entry[5];
$city{$line} = $entry[6];
$country{$line} = $entry[7];
$Date{$line} = $entry[8];
$Comments{$line} = $entry[9];
if ($EMail{$line}) {
print "<B>Name: </B>\n";
print "<b><a
href=\"mailto:$EMail{$line}\">$Name{$line}</a></b><br>\n";
}
else {
print "<B>Name: </B>\n";
print "<b>$Name{$line}</b>\n";
if ($URL{$line}) {
print "<B>Website: </B>\n";
print "<b><a href=\"$URL{$line}\">$URL{$line}</a></b><br>\n";
}
else {
print "<br>\n";
}
if ($referrer{$line}) {
print "<B>Referred by: </B>\n";
print "<b>$referrer{$line}</b><br>\n";
}
else {
print "<br>\n";
}
if ($city{$line}) {
print "<B>From: </B>\n";
print "<b>$city{$line} ,</b>\n";
}
else {
print "<br>\n";
}
if ($country{$line}) {
print "<b>$country{$line}<br></b>\n";
}
else {
print "<br>\n";
}
print "<br>\n";
print "<b>$Date{$line}<b>\n";
print "<b>Comments: </B><BLOCKQUOTE>\n";
print "$Comments{$line}\n";
print "</BLOCKQUOTE>\n";
print "<p><img src=\"../../images/silvbar.gif\" width=\"100%\"
height=\"15\"></p>\n";
}
print " <center>\n";
if ($totalPage <= 1) {
print " Previous Page | Next Page\n";
}
elsif ($page == 1) {
print " Previous Page | <a href=\"$cgiurl\?Page=",$page+1,"\">Next
Page</a>\n";
}
elsif ($page == $totalPage) {
print " <a href=\"$cgiurl\?Page=",$page-1,"\">Previous Page</a> | Next
Page\n";
}
else {
print " <a href=\"$cgiurl\?Page=",$page-1,"\">Previous Page</a> | <a
href=\"$cgiurl\?Page=",$page+1,"\">Next Page</a>\n";
}
print " </center>\n";
print "</body>\n";
print "</html>\n";
exit;
}
############################################################################
#
################################ Subroutines
################################
############################################################################
#
# Are they allowed access?
############################################################################
#
sub getAccess {
open(MESG,"$mesgFile") || &error(mesgFile);
@IPs = <MESG>;
close(MESG);
foreach $line (@IPs) {
next unless $line;
if ($line =~ m/<!--Restrict IP: (.*)-->/) {
@IPs = split(/,/, $1);
foreach $ip (@IPs) {
if ($ENV{'REMOTE_ADDR'})
if ($ENV{'REMOTE_ADDR'} =~ /$ip/) {
&error(noAccess);
}
}
}
}
}
}
############################################################################
#
# Get the Date for Entry
############################################################################
#
sub getDate {
@days = ('Sunday','Monday','Tuesday','Wednesday','Thursday',
'Friday','Saturday');
@months = ('January','February','March','April','May','June','July',
'August','September','October','November','December');
(undef,$min,$hour,$mDay,$mon,$year,$wDay,undef,undef) = localtime(time);
if ($hour == 0) { $hour = 12; $ampm = "am"; }
elsif ($hour == 12) { $ampm = "pm"; }
elsif ($hour > 12) { $hour -= 12; $ampm = "pm"; }
else { $ampm = "am";}
if ($min < 10) { $min = "0$min"; }
$date = "$days[$wDay], $mDay $months[$mon] `$year at $hour\:$min$ampm";
}
############################################################################
#
# Print out a nice header. Will prob change for every Feedback Form
############################################################################
#
sub header {
print <<Header;
Content-type: text/html
<HTML><HEAD><meta http-equiv="Content-Type" content="text/html;
charset=windows-1251">
<title>BRATVA Common Sites, Inc. Guestbook</title>
</HEAD>
<BODY BGCOLOR = "000000" TEXT = "red">
Header
}
############################################################################
#
# A Name or a Comment was left out of the Feedback Form
############################################################################
#
sub noNameOrNoComment {
&header('Feedback Form');
print " <h3>Form error</h3>\n";
print " Some of the required fields were missing from the form you
submitted.<br>\n";
print " Please fill in all the boxes and re-send.<p><br>\n";
print " <table width=\"100%\"><tr>\n";
print " <td width=\"50%\" align=left><a href=\"$cgiurl\?Feedback\">Return
to form</a></td>\n";
print " <td width=\"50%\" align=right><a href=\"$cgiurl\?Page=1\">Return
to the Guestbook</a></td>\n";
print " </tr></table>\n";
print "</body>\n";
print "</html>\n";
exit;
}
############################################################################
#
# Thank You
############################################################################
#
sub thankYou {
&header('Feedback Form');
print " <h3>Thanks!</h3>\n";
print " You have submitted the following comments to the suggestion
box:<br>\n";
print "<p><img src=\"../../images/silvbar.gif\" width=\"100%\"
height=\"15\"></p>\n";
if ($FORM{'EMail'}) {
print "<B>Name: </B>\n";
print "<b><a
href=\"mailto:$FORM{'EMail'}\">$FORM{'Name'}</a></b><br>\n";
}
else {
print "<B>Name: </B>\n";
print "<b>$FORM{'Name'}</b>\n";
if ($FORM{'URL'}) {
print "<B>Website: </B>\n";
print "<b><a href=\"$FORM{'URL'}\">$FORM{'URL'}</a></b><br>\n";
}
else {
print "<br>\n";
}
if ($FORM{'referrer'}) {
print "<B>Referred by: </B>\n";
print "<b>$FORM{'referrer'}</b><br>\n";
}
else {
print "<br>\n";
}
if ($FORM{'city'}) {
print "<B>From: </B>\n";
print "<b>$FORM{'city'} ,</b>\n";
}
else {
print "<br>\n";
}
if ($FORM{'country'}) {
print "<b>$FORM{'country'}<br></b>\n";
}
else {
print "<br>\n";
}
print "<br>\n";
print "<b>$Date{$line}<b>\n";
print "<b>Comments: </B><BLOCKQUOTE>\n";
print "$FORM{'Comments'}\n";
print "</BLOCKQUOTE>\n";
print "<p><img src=\"../../images/silvbar.gif\" width=\"100%\"
height=\"15\"></p>\n";
print " <br>\n\n";
print " <table width=\"100%\"><tr>\n";
print " <td width=\"100%\" align=left><a href=\"$cgiurl\?Page=1\">See
Suggestion Box</a></td>\n";
print " </tr></table>\n";
print "</body>\n";
print "</html>\n";
exit;
}
############################################################################
#
# Parse it
############################################################################
#
sub parseForm {
# Get the input
$FORM{'action'} = '';
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
# Split the name-value pairs
@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
# Un-Webify plus signs and %-encoding
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$value =~ s/<!--(.|\n)*-->//g;
$value =~ s/&/&/g;
$value =~ s/\"/"/g;
$value =~ s/\n/<br>/g;
if ($allowHtml != 1) {
$value =~ s/<([^>]|\n)*>//g;
}
$FORM{$name} = $value;
}
}
############################################################################
#
# return information from the html
############################################################################
#
sub returnHtml {
$type = $_[0];
if ($type eq 'Remove') {
if ($FORM{'prevNext'}) {
print "Location:
$cgiurl\?Remove&Page=$FORM{'prevNext'}&User=$FORM{'USER'}&Pwd=$FORM{'PWD'}\n
\n";
}
else {
print "Location:
$cgiurl\?Remove&Page=1&User=$FORM{'USER'}&Pwd=$FORM{'PWD'}\n\n";
}
}
elsif ($type eq 'IPAccess') {
print "Location:
$cgiurl\?IPAccess&User=$FORM{'USER'}&Pwd=$FORM{'PWD'}\n\n";
}
elsif ($type eq 'enterPasswd') {
if ($FORM{'command'}) {
if ($FORM{'command'} eq 'Remove') {
print "Location: $cgiurl\?Remove&Page=1&User=$USER&Pwd=$PWD\n\n";
}
else {
print "Location: $cgiurl\?$FORM{'command'}&User=$USER&Pwd=$PWD\n\n";
}
}
else {
print "Location: $cgiurl\?Page=1\n\n";
}
}
elsif ($type eq 'changePassword') {
open(MAIL, "|$mailProg") || &error(mailProg);
print MAIL "To: $recipient\n";
print MAIL "From: $recipient ($recipientName)\n";
print MAIL "Subject: Suggestion Box: Password Change\n\n";
print MAIL "Your Password for Administration has been changed! Results
are below:\n";
print MAIL
"---------------------------------------------------------------------------
--\n";
print MAIL "New Username: $newUsername\n";
print MAIL "New Password: $FORM{'passwd1'}\n\n";
print MAIL "-$date\n";
print MAIL
"---------------------------------------------------------------------------
--\n";
print MAIL "Do not forget these, since they are now encoded in a file,
and not readable!\n\n";
close (MAIL);
&header('Admin Password Changed');
print " <center>\n";
print " <h1>Admin Password Changed</h1>\n";
print " Your Password for Admin has been changed! Results are
below:<p><hr noshade size=4><p>\n";
print " <b>New Username: $newUsername<p>\n";
print " New Password: $FORM{'passwd1'}</b><p>\n";
print " <hr noshade><p>\n";
print " Do not forget these, since they are now encoded in a file, and
not readable!\n";
print " <p><hr noshade size=4><br>\n";
print " [<a href=\"$cgiurl\?Page=1\">Suggestion Box</a>] [<a
href=\"$cgiurl\?Supervisor\">Supervisor's Page</a>]\n";
print " </center>\n\n";
print "</body>\n";
print "</html>\n";
exit;
}
}
############################################################################
#
# Password Error
############################################################################
#
sub error {
$error = $_[0];
if ($error eq 'badCombo') {
&header('Bad Username - Password Combination');
print " <center>\n";
print " <h1>Bad Username - Password Combination</h1>\n";
print " <p><hr noshade size=4><p>\n";
print " You entered and invalid username password pair.\n";
print " <p><hr noshade size=4><p>\n";
print " <a href=\"$cgiurl\?Supervisor\">Try Again</a>\n";
print " </center>\n\n";
print " <p><center><font size=1>Online Administrative Feedback Form
script created by <a href=\"http://Pages.NYU.EDU/~rw263/\">Randy Jae
Weinstein</a></font></center>\n\n";
print "</body>\n";
print "</html>\n";
exit;
}
elsif ($error eq 'notSame') {
&header('Incorrect Password Type-In');
print " <center>\n";
print " <h1>Incorrect Password Type-In</h1>\n";
print " <p><hr noshade size=4><p>\n";
print " The passwords you typed in for your new password were not the
same.<br>\n";
print " (NOTE: Passwords must be atleast five character)<br>\n";
print " You may have mistyped it.\n";
print " <p><hr noshade size=4><p>\n";
print " <a href=\"$cgiurl\?changePassword\">Try Again</a>\n";
print " </center>\n\n";
print "</body>\n";
print "</html>\n";
exit;
}
elsif ($error eq 'noAccess') {
&header('403 Forbidden');
print " <h1>403 Forbidden</h1>\n";
print " Your client does not have permission to get URL
$ENV{'SCRIPT_NAME'} from this server.\n\n";
print "</body>\n";
print "</html>\n";
exit;
}
elsif ($error eq 'mailProg') {
&header('Mail Program Setup Wrong');
print " <center>\n";
print " <h1>Mail Program Setup Wrong</h1>\n";
print " <p><hr noshade size=4><p>\n";
print " Please contact <a mailto:\"$recipient\">$recipientName</a> as
to what you may have done to cause this error.<br>\n";
print " (Error Message: $!)\n";
print " </center>\n";
&passwdTrailer;
}
elsif ($error eq 'mesgFile') {
&header('Could Not Open Comment File For Reading');
print " <center>\n";
print " <h1>Could Not Open Comment File For Reading</h1>\n";
print " <p><hr noshade size=4><p>\n";
print " Could not open the password file for reading!<br>\n";
print " (Error Message: $!)\n";
print " </center>\n";
&passwdTrailer;
}
elsif ($error eq 'AccessFile') {
&header('Could Not Open Access File For Reading');
print " <center>\n";
print " <h1>Could Not Open Access File For Reading</h1>\n";
print " <p><hr noshade size=4><p>\n";
print " Could not open the access file for reading!<br>\n";
print " (Error Message: $!)\n";
print " </center>\n";
&passwdTrailer;
}
elsif ($error eq 'noEntryChange') {
&header('Could Not Open Comment File For Writing');
print " <center>\n";
print " <h1>Could Not Open Comment File For Writing</h1>\n";
print " <p><hr noshade size=4><p>\n";
print " Could not open the password file for writing!<br>\n";
print " Password not changed!<br>\n";
print " (Error Message: $!)\n";
print " </center>\n";
&passwdTrailer;
}
elsif ($error eq 'noPasswdChange') {
&header('Could Not Open Password File For Writing');
print " <center>\n";
print " <h1>Could Not Open Password File For Writing</h1>\n";
print " <p><hr noshade size=4><p>\n";
print " Could not open the password file for writing!<br>\n";
print " Password not changed!<br>\n";
print " (Error Message: $!)\n";
print " </center>\n";
&passwdTrailer;
}
exit;
}
############################################################################
#
# Stuff to print at the end
############################################################################
#
sub passwdTrailer {
print " <p><hr noshade size=4><p>\n";
print " <center><a href=\"$ENV{'HTTP_REFERER'}\">Try
Again</a></center>\n\n";
print "</body>\n";
print "</html>\n";
exit;
}
############################################################################
#
# Check the Password
############################################################################
#
sub checkPasswd {
open(MESG,"$mesgFile") || &error(mesgFile);
@passwdLines = <MESG>;
close(MESG);
foreach $line (@passwdLines) {
if ($line =~ m/<!--Name\/Pwd: (.*):(.*)-->/)
$username = $1;
$passwd = $2;
}
}
if ($FORM{'USER'} && $FORM{'PWD'}) {
if (!(($FORM{'PWD'} eq $passwd) && ($FORM{'USER'} eq $username))) {
&error(badCombo);
}
}
else {
$testPasswd = crypt($FORM{'password'}, substr($passwd, 0, 2));
if (!(($testPasswd eq $passwd) && ($FORM{'username'} eq $username))) {
&error(badCombo);
}
}
}
############################################################################
#
# Check EMail Subroutine
############################################################################
#
sub checkEmail {
# Initialize local email variable with input to subroutine.
$email = $_[0];
# If the e-mail address contains:
if ($email =~ /(@.*@)|(\.\.)|(@\.)|(\.@)|(^\.)/ ||
# the e-mail address contains an invalid syntax. Or, if the
# syntax does not match the following regular expression pattern
# it fails basic syntax verification.
$email !~
/^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,3}|[0-9]{1,3})(\]?)$/) {
# Basic syntax requires: one or more characters before the @ sign,
# followed by an optional '[', then any number of letters, numbers,
# dashes or periods (valid domain/IP characters) ending in a period
# and then 2 or 3 letters (for domain suffixes) or 1 to 3 numbers
# (for IP addresses). An ending bracket is also allowed as it is
# valid syntax to have an email address like: user@[255.255.255.0]
# Return a false value, since the e-mail address did not pass valid
# syntax.
return 0;
}
else {
# Return a true value, e-mail verification passed.
return 1;
}
}
################################ End Of File
################################
------------------------------
Date: Wed, 28 Apr 1999 21:57:22 GMT
From: bart.lateur@skynet.be (Bart Lateur)
Subject: Re: How do i print something using perl?
Message-Id: <372880c5.574240@news.skynet.be>
smnayeem@my-dejanews.com wrote:
>Does anyone know how i can direct the output of print statements to the
>printer?
You can't. (I'm assuming a WinPC, as suggested by the post's headers).
Well, not easily, reliably, and in a generic manner. (You REALLY don't
want to write printer-specific code!)
Simple solution: write the output into a temporary file. Then use the
ShellExecute() API call, to make another program print the file. I'm not
sure on exactly how to do that from within Perl (I haven't looked at the
API modules yet, as Win32 isn't my main platform), but the API call
does support it, when you replace the second parameter, ordinarily
"Open", with "Print". what program is used to print the document with,
depends on that temorary file's extension.
Bart.
------------------------------
Date: 28 Apr 1999 22:15:36 GMT
From: mkantor@zadok.ics.uci.edu (Knowledge Depot)
Subject: How do you send an attachment using MIME::Entity?
Message-Id: <7g81a8$moe@drivel.ics.uci.edu>
Hi, I'm trying to figure out how to send an attachment using the MIME::Entity.
I have no trouble sending a simple message like this:
$entity = build MIME::Entity
(From => "mkantor",
To => "mkantor",
Subject => "testing",
Data => "this is a test");
$entity->smtpsend(Host => $mysmtphost);
This works fine, but according to the documentation I should be able to do
the following which results in an empty message:
$entity = build MIME::Entity
(Type => "multipart/mixed",
Boundary => "---1234567",
From => $Config{'ReturnAddress'},
Sender => $Config{'ReturnAddress'},
Return-Path => $Config{'ReturnAddress'},
Subject => $Subject,
To => $To);
$entity->attach(Data => $Body);
$entity->smtpsend(Host => $mysmtphost);
If anyone can tell me the proper way to send the $entity object after attaching something to it, can you please let me know? I know that I am correctly adding the attachment because when I print out my $entity, it contains the attachment. But once I specify that the entity is "multipart/mixed" it stops sending.
Thanks!!
Michael (mkantor@ics.uci.edu)
------------------------------
Date: Wed, 28 Apr 1999 16:59:05 -0500
From: "Tim Armbruster" <t-armbruster@ti.com>
Subject: Re: Invalid Header ?
Message-Id: <oALV2.23$GU3.2185@dfw-service1.ext.raytheon.com>
It's impossible to tell what your problem is without seeing code. Post some
code, but trim it down to under 40 lines.
------------------------------
Date: Wed, 28 Apr 1999 22:01:04 GMT
From: "ITTE" <info@itte.org>
Subject: Learning Perl
Message-Id: <01be91c2$a5435990$e67de8d0@debhome>
***Accelerated Perl Programming Training, (Intro-Interm.)
May 13-14, 1999 San Jose, CA
Tuition: $799.
Group rates: register 3 individuals from the same organization and the 3rd
registrant is complimentary --- subject to availability.
View the full course description @ http://www.itte.org/TRAIN.perl.html
This hands-on technical workshop is accomplishment-oriented providing
attendees with real-life examples. This workshop teaches the foundations
Perl programming through a series of case studies and practical examples.
Upon completion, attendees will be able to write Perl programs of their
own. To our knowledge, no other training provides this much learning in
such a brief time.
***CGI Scripting with Perl Training
June 1, 1999 San Jose, CA
Tuition: $399.
Call for group rates.
View the full course description @ http://www.itte.org/TRAIN/sperl.html
This workshop is for Perl programmers who need to construct interactive Web
sites. The essential goal of this hands-on workshop is the acquisition of
real skills by enabling the attendee to: *process data from HTML forms
*generate dynamic Web pages *capture form data in files *send e-mail from
Perl scripts *use the CGI.pm Perl module to make CGI scripting easier
*debug PERL CGI scripts.
***Advanced Perl Programming Training
June 17-18, 1999 San Jose, CA
Tuition: $799.
Register 3 individuals from the same organization, 3rd registrant is
complimentary -- subject to availability.
View the full course description @ http://www.itte.org/TRAIN/adperlpg.html
This accelerated technical workshop teaches advanced concepts and
capabilities that can be used to write procedures in Perl. Attendees will
learn to master the techniques of Perl in just two days.
Space is limited to 15 per workshop.
All technical workshops are available for on-site training for 8 or more
attendees.
Register: info@itte.org
------------------------------
Date: Wed, 28 Apr 1999 22:02:43 GMT
From: tiwason@my-dejanews.com
Subject: Re: MIME::Tools and recommended filename
Message-Id: <7g80i1$va0$1@nnrp1.dejanews.com>
Nevermind......
$head = $first_part->head;
$eff_type = eval {$head->recommended_filename;};
Had to "get the head" first......
-----------== Posted via Deja News, The Discussion Network ==----------
http://www.dejanews.com/ Search, Read, Discuss, or Start Your Own
------------------------------
Date: Wed, 28 Apr 1999 17:02:10 -0500
From: "Tim Armbruster" <t-armbruster@ti.com>
Subject: Re: MQSeries.pm
Message-Id: <hDLV2.24$GU3.2199@dfw-service1.ext.raytheon.com>
There is a newsgroup called comp.lang.perl.modules that seems to have a
pretty active crowd.
------------------------------
Date: Wed, 28 Apr 1999 22:38:22 GMT
From: alastair@calliope.demon.co.uk (Alastair)
Subject: Re: problem
Message-Id: <slrn7if70t.5f.alastair@calliope.demon.co.uk>
Adam Dittmer <x30407@wrek1.mar.lmco.com> wrote:
>with the second page i want to put it in part number order
>but i am not sure how to search the html file and pull out what i need
>for comparison. if someone could help me think of a way to get the
>info out i would appreciate it.
Is the problem searching a file, sorting by part number,..? What have you tried?
--
Alastair
work : alastair@psoft.co.uk
home : alastair@calliope.demon.co.uk
------------------------------
Date: Wed, 28 Apr 1999 22:11:09 GMT
From: mcafee@waits.facilities.med.umich.edu (Sean McAfee)
Subject: Re: Quotes question??
Message-Id: <1ILV2.3048$hl6.113558@news.itd.umich.edu>
In article <372775aa@discussions>, steve <losteven@yahoo.com> wrote:
>I have a statement like this:
>$me = "$var1,$var2,$var3,$var4,$var5"
>If I print out $me, I will get:
>My,name,is,steve
>but if I want to get this:
>"My","name","is","steve"
>what do I need to do?? How do I modify
>$me = "$var1,$var2,$var3,$var4,$var5"??
$me = qq/"$var1","$var2","$var3","$var4","$var5"/;
You can read about "Quote and Quote-like Operators" in the perlop man page.
--
Sean McAfee | GS d->-- s+++: a26 C++ US+++$ P+++ L++ E- W+ N++ |
| K w--- O? M V-- PS+ PE Y+ PGP?>++ t+() 5++ X+ R+ | mcafee@
| tv+ b++ DI++ D+ G e++>++++ h- r y+>++** | umich.edu
------------------------------
Date: 12 Dec 98 21:33:47 GMT (Last modified)
From: Perl-Request@ruby.oce.orst.edu (Perl-Users-Digest Admin)
Subject: Special: Digest Administrivia (Last modified: 12 Dec 98)
Message-Id: <null>
Administrivia:
Well, after 6 months, here's the answer to the quiz: what do we do about
comp.lang.perl.moderated. Answer: nothing.
]From: Russ Allbery <rra@stanford.edu>
]Date: 21 Sep 1998 19:53:43 -0700
]Subject: comp.lang.perl.moderated available via e-mail
]
]It is possible to subscribe to comp.lang.perl.moderated as a mailing list.
]To do so, send mail to majordomo@eyrie.org with "subscribe clpm" in the
]body. Majordomo will then send you instructions on how to confirm your
]subscription. This is provided as a general service for those people who
]cannot receive the newsgroup for whatever reason or who just prefer to
]receive messages via e-mail.
The Perl-Users Digest is a retransmission of the USENET newsgroup
comp.lang.perl.misc. For subscription or unsubscription requests, send
the single line:
subscribe perl-users
or:
unsubscribe perl-users
to almanac@ruby.oce.orst.edu.
To submit articles to comp.lang.perl.misc (and this Digest), send your
article to perl-users@ruby.oce.orst.edu.
To submit articles to comp.lang.perl.announce, send your article to
clpa@perl.com.
To request back copies (available for a week or so), send your request
to almanac@ruby.oce.orst.edu with the command "send perl-users x.y",
where x is the volume number and y is the issue number.
The Meta-FAQ, an article containing information about the FAQ, is
available by requesting "send perl-users meta-faq". The real FAQ, as it
appeared last in the newsgroup, can be retrieved with the request "send
perl-users FAQ". Due to their sizes, neither the Meta-FAQ nor the FAQ
are included in the digest.
The "mini-FAQ", which is an updated version of the Meta-FAQ, is
available by requesting "send perl-users mini-faq". It appears twice
weekly in the group, but is not distributed in the digest.
For other requests pertaining to the digest, send mail to
perl-users-request@ruby.oce.orst.edu. Do not waste your time or mine
sending perl questions to the -request address, I don't have time to
answer them even if I did know the answer.
------------------------------
End of Perl-Users Digest V8 Issue 5511
**************************************