alt="Книгажалоб" WIDTH="258" HEIGHT="60"></td>
</tr>
</table>
</div><div align="left">
<table border="0" width="630" height="53" cellspacing="0" cellpadding="0">
<tr>
<td width="200" height="260" valign="top"><p align="center">
HTML
DoInclude("D:/InetPub/wwwroot/_menu.htm");
print <<HTML;
</p>
<p align="left"></td>
<td width="10" height="53" valign="top"></td>
<td width="410" height="53" valign="top"><p align="left"><small>Вынеуказали
свое имя, E-mail, либо не заполнили сам текст Вашего
отзыва. Вернитесь, пожалуйста, на страницу формы
и заполните требуемые поля.</small></p>
<p align="center"><a href="add_guestbook.pl">Назад</a> </td>
</tr>
</table>
</div>
<table>
<tr>
<td width="10" height="53" valign="top"></td>
</tr>
</table>
</body>
</html>
HTML
}
else # все данные правильно введены
{
# Если все поля заполнены правильно, то начинаем их обрабатывать.
$Text=~tr/\r\n/ /; #заменяем перевод строки на пробел
# Если в текстовом поле формы (text box) посетитель нажимал Enter,
# то нужно убрать символы перевода строки, чтобы можно было записать
# все поля формы в одну строку файла.
if ($Work eq '') {$Work=' '}; #если пусто - то пробел
# Если поле не заполнено, то оно равно пробелу.
$Name=~s/&/ /g;
$Work=~s/&/ /g;
$Text=~s/&/ /g;
$Email=~s/&/ /g;
# Если посетитель использовал символ &, то заменяем его на пробел,
# поскольку этот символ мы будем использовать для разделения наших полей в файле.
open(OutFile, ">>guestbook.txt") || die;
# Открываем файл для добавления.
$Time=localtime; #получаем время
# Получаем время заполнения гостевой книги.
$line=join('&', $Time, $Name, $Work, $RadioButton, $Text, $Email, $ENV{REMOTE_HOST});
# И, наконец, слепляем все поля формы в одну строку. На всякий случай добавляем в конце
# IP адрес посетителя, взятый из переменных окружения.
print OutFile "$line\n";
close OutFile;
# Записываем полученную строку в файл и закрываем его.
# Осталось только сказать посетителю спасибо.
# выводим сообщение о успехе
print "Content-type: text/html\n\n";
print "<html>\n" ;
print "\n" ;
print "<head>\n" ;
print '<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">'."\n" ;
print '<meta name="GENERATOR" content="Microsoft FrontPage 3.0">'."\n" ;
print "<title>Книга жалоб и предложений</title>\n" ;
print "</head>\n" ;
print "\n" ;
print '<body background="../images/background_new.jpg">'."\n" ;
print '<div align="left">'."\n" ;
print "\n" ;
print '<table border="0" width="630" height="49">'."\n" ;
print " <tr>\n" ;
print ' <td width="200" height="45"></td>'."\n" ;
print ' <td width="430" height="45"><p align="center">';
print '<img src="../images/guestbook.GIF" alt="Книгажалоб" WIDTH="258" HEIGHT="60"></td>'."\n" ;
print " </tr>\n" ;
print "</table>\n" ;
print '</div><div align="left">'."\n" ;
print "\n" ;
print '<table border="0" width="630" height="53" cellspacing="0" cellpadding="0">'."\n" ;
print " <tr>\n" ;
print ' <td width="200" height="260" valign="top"><p align="center">'."\n" ;
DoInclude("D:/InetPub/wwwroot/_menu.htm");
print ' <p align="left"></td>'."\n" ;
print ' <td width="10" height="53" valign="top"></td>'."\n" ;
print ' <td width="410" height="53" valign="top"><p align="center"><small>Вашиданные'."\n" ;
print " приняты. Спасибо.</small></p>\n" ;
print ' <p align="center"><a href="read_guestbook.pl">';
print '<img src="../images/read.jpg" alt="Почитать" border="0" WIDTH="63" HEIGHT="21"></a> </td>'."\n" ;
print " </tr>\n" ;
print "</table>\n" ;
print "</div>\n" ;
print "\n" ;
print "<table>\n" ;
print " <tr>\n" ;
print ' <td width="10" height="53" valign="top"></td>'."\n" ;
print " </tr>\n" ;
print "</table>\n" ;
print "</body>\n" ;
print "</html>\n" ;
}
# Не забываем подпрограмму разбора данных из формы.
sub GetFormInput {
(*fval) = @_ if @_ ;
local ($buf);
if ($ENV{'REQUEST_METHOD'} eq 'POST') {
read(STDIN,$buf,$ENV{'CONTENT_LENGTH'});
}
else {
$buf=$ENV{'QUERY_STRING'};
}
if ($buf eq "") {
return 0 ;
}
else {
@fval=split(/&/,$buf);
foreach $i (0 .. $#fval){
($name,$val)=split (/=/,$fval[$i],2);
$val=~tr/+/ /;
$val=~ s/%(..)/pack("c",hex($1))/ge;
$name=~tr/+/ /;
$name=~ s/%(..)/pack("c",hex($1))/ge;
if (!defined($field{$name})) {
$field{$name}=$val;
}
else {
$field{$name} .= ",$val";
#if you want multi-selects to goto into an array change to:
#$field{$name} .= "\0$val";
}
}
}
return 1;
}
Вот и все. Пример работы описанного скрипта можно посмотреть на http://treagraf.tasur.edu.ru/cgi-bin/add_guestbook.pl
read_guestbook.pl - чтениекниги
#! e:\perl5\perl
# Первая строка, как обычно
require "ssi-pl.pl";
# Я использую навигационную панель в виде SSI-включения. Для этого используется модуль ssi-pl.pl
open(InFile, "guestbook.txt") || die;
# Открываем файл с записями гостевой книги.
@lines=<InFile>;
# Читаем строки в массив.
# Выдаем шапку HTML страницы.
print <<HTML;
Content-type: text/html
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<meta name="GENERATOR" content="Microsoft FrontPage 3.0">
<title>Книга жалоб и предложений - нам пишут</title>
</head>
<body background="../images/background_new.jpg">
<div align="left">
<table border="0" width="630" height="49">
<tr>
<td width="200" height="45"></td>
<td width="430" height="45"><p align="center"><img src="../images/guestbook.GIF"
alt="Книгажалоб" WIDTH="258" HEIGHT="60"></td>
</tr>
</table>
</div><div align="left">
<table border="0" width="630" height="53" cellspacing="0" cellpadding="0">
<tr>
<td width="200" height="260" valign="top"><p align="center"><small>
HTML
DoInclude("D:/InetPub/wwwroot/_menu.htm");
print <<HTML;
</p>
<p align="left"></td>
<td width="10" height="53" valign="top"></td>
<td width="410" height="53" valign="top"><p align="center">Нампишут:</p>
<table border="0" width="100%" cellspacing="0" cellpadding="0">
HTML
# Теперь выводим записи в невидимой (в смысле, рамка не видима) таблице.
# Чтобы свежие записи отображать первыми, обрабатываем массив строк с конца.
for ($i=$#lines; $i>=$[; $i--) #обрабатываем строки файла с конца
{
# Разделяем строку на части
@item=split('&', $lines[$i]); #разделяем на части
# Теперь заменяем HTML тэги в записи (на случай какого-нибудь хитрого юзера)
foreach (@item)
{
$_=~s/</</g;
$_=~s/>/>/g;
}
# Приступаем непосредственно к выводу записей в HTML
print "<tr>\n";
print '<td width="100%"><dl>'."\n";
# В зависимости от поля, где посетителю предлагался выбор понравилось - не понравилось,
# рисуем картинку с веселой или грустной мордочкой соответственно. В качестве ALT тэга
# картинки пропишем IP адрес посетителя.
print '<dt><img src="../images/'.$item[3].'.gif" width="31" height="31" alt="';
priny $item[6].'" align="absbottom"'."\n";
# Выводим остальные поля.
print 'align="absmiddle"><small>'.' '.$item[4]."</small></dt>\n";
print '<dt><small>'.$item[1].', '.$item[2]."</small></dt>\n";
print '<dt><a href="mailto:'.$item[5].'"><small>'.$item[5].'</small></a></dt>'."\n";
print '<dt><small>'.$item[0]."</small></dt>\n";
print "</dl>\n";
print "</td>\n";
print "</tr>\n";
}
# Осталось вывести окончание HTML
print <<HTML;
</table>
</td>
<td width="10" height="53" valign="top"></td>
</tr>
</table>
</div>
</body>
</html>
HTML
close InFile;
# Закрываем файл с записями гостевой книги.
Список литературы
Александр Боровский . Практический Перл для начинающего.