Примеры скриптов, выполненных на языке Perl

Скрипт отображения новостей на сайте

Автор:			baxter (Россия)
E-mail:			baxter@au.ru
Состав скрипта:		3 файла
Качество исполнения:	6
news.cgi


#!/usr/local/bin/perl
#====================SETUP=====================================
$q = 5;			#количество выводимых записей
$colordate = "#FF0000";	#цвет даты
$colortext = "#000000";	#цвет текста
# цвет ссылки /История/ зависит от установок цвета ссылок в
# несущем html-документе.
#==============================================================
open (NEWS, "news.db") || die "no file!";
@news = <NEWS>;
close (NEWS);
print "Content-Type: text/html \n\n";
print "<b>Новости сайта <a href="javascript:if(confirm('http://baxter.virtualave.net/ \n\nThis file was not retrieved by Teleport Pro, because it is addressed on a domain or path outside the boundaries set for its Starting Address. \n\nDo you want to open it from the server?'))window.location='http://baxter.virtualave.net/'" tppabs="http://baxter.virtualave.net/">.</a></b><hr>\n";
foreach $base (@news)
	{
	if ($s<$q)
		{
		@data = split (/::/,$base);
 		print "<small><font color=$colordate><b>$data[0]</b></font>";
		print "<i><font color=$colortext>- $data[1]</i></font></small><br>\n";
		$s=$s+1;
	}
}
print "<a href="javascript:if(confirm('http://pgbook.dax.ru/cgi-bin/news/newsh.cgi \n\nThis file was not retrieved by Teleport Pro, because it is addressed on a domain or path outside the boundaries set for its Starting Address. \n\nDo you want to open it from the server?'))window.location='http://pgbook.dax.ru/cgi-bin/news/newsh.cgi'" tppabs="http://pgbook.dax.ru/cgi-bin/news/newsh.cgi"><font size=1><i>История</i></font></a><hr>\n";
news.db


29.09.1999::Обновлен интерфейс сайта.
04.10.1999::Добавлен скрипт вывода истории в виде html-файла.

newsh.cgi

#!/usr/local/bin/perl
#====================SETUP=====================================
$colordate = red; #цвет даты
$colortext = black; #цвет текста
#==============================================================
open (NEWS, "news.db") || die "no file!";
@news = <NEWS>;
close (NEWS);
print "Content-Type: text/html \n\n";
print "<html><head><title>Новости сайта /История/</title></head><body bgcolor=\"#E0E0E0\">\n";
print "<table width=\"640\" border=\"0\" bgcolor=\"#FFFFFF\"align=\"center\"><tr><td>"; 
print "<h2><b>Новости сайта <a href="javascript:if(confirm('http://baxter.virtualave.net/ \n\nThis file was not retrieved by Teleport Pro, because it is addressed on a domain or path outside the boundaries set for its Starting Address. \n\nDo you want to open it from the server?'))window.location='http://baxter.virtualave.net/'" tppabs="http://baxter.virtualave.net/">.</a></b></h2><hr>\n";
foreach $base (@news)
	{
	@data = split (/::/,$base);
 	print "<font color=$colordate><b>$data[0]</b></font>";
	print " <i><font color=$colortext>- $data[1]</i><br>
	\n";
	}
print "<\/td><\/tr><\/table>";
print "</bdy></htl>";
		
		
<p>
Для работы скрипта требуется, чтобы все файлы находились в директории CGI-BIN.<br>
Файл news.db содержит записи новостей в таком формате:</p>
<pre class="c">дата<b>::</b>новость</pre>
<p>
Причем в каждой строке файла может содержаться только одна новость.
</p>
<p>
Разберем работу файла news.cgi .<br>
3,4,5 строки - установка параметров отображения записей.<br>
9 - открытие файла news.db . При неудачном открытии в поток ошибок выводится "no file!".<br>
10 - считывание файла в массив @news.<br>
11 - закрытие файла.<br>
12 - печать HTTP заголовка.<br>
13 - печать заголовка новостной информации.<br>
14 - начало цикла, где переменной $base поочередно присваивается каждый элемент массива @news.<br>
16 - выполняется логическая операция: если $s меньше $q, то выполняется блок ниже, иначе - ничего не выполняется. С точки зрения функциональности этого кода, здесь всё в порядке: неопределенная переменная $s принимает скалярное значение 0 при этой операции и блок начинает свое выполнение. Но не смотря на это, использование неописанных переменных является признаком дурного стиля. НИКОГДА НЕ ОПЕРИРУЙТЕ НЕОПРЕДЕЛЕННЫМИ ПЕРЕМЕННЫМИ в своих программах!
<br>
17 - начало блока.<br>
18 - разделяем переменную $base на куски по шаблону /::/ и записываем их в массив @data.<br>
19 - выводим значение переменной $data[0]. По сути, мы выводим дату новости.<br>
20 - выводим значение переменной $data[1]. Этим мы выводим сам текст новости.<br>
21 - инкриминируем переменную $s. Опять же, рациональнее было бы написать $s++.<br>
22 - конец блока.<br>
23 - конец цикла.<br>
24 - выводим ссылку на архивные записи.
</p>
<p>
Помимо описанных выше недочетов, в этом скрипте имеются следующие неприятные моменты:
</p>
<ol>
<li>Весь файл сгружается в массив. Хоть это и достаточно быстрый способ получения данных из файла, не стоит забывать, что в итоге ВЕСЬ файл оказывается в памяти сервера, даже те его части, которые вовсе не подлежат выводу. Хорошо, если вы записываете новости, ну скажем, раз в месяц, а если каждый день? Посчитайте, какого объема может достичь файл?!<br>
Поэтому, чтобы экономить память сервера, я бы рекомендовал считывать одну строчку из файла в переменную $base, каждый раз до её сепарации.
<li>После того, как все 5 строчек новостей были выведены, цикл foreach продолжает работать "вхолостую". Т.е. скрипт некоторое время работает, но не выполняет полезных действий. КПД скрипта снижается. Выход напрашивается сам собой: после окончания вывода 5-ой строки, нужно выходить из цикла. Делается это с помощью оператора last.
</ol>
<p>Есть, конечно, еще несколько недочетов, но они не так "режут глаз", как те, что я перечислил выше.</p>
<p>
newsh.cgi работает аналогичным образом, только там снято ограничение на количество выводимых строк.
</p>
<p align="center" class="h">Скрипт отображает дату и время</p>
<pre>
Автор:			неизвестен (Россия)
WEB:			<a href="javascript:if(confirm('http://www.superbest.com/ \n\nThis file was not retrieved by Teleport Pro, because it is addressed on a domain or path outside the boundaries set for its Starting Address. \n\nDo you want to open it from the server?'))window.location='http://www.superbest.com/'" tppabs="http://www.superbest.com/" target="_blank">http://www.superbest.com</a>
Состав скрипта:		1 файл
Качество исполнения:	8
</pre>
<pre class="c">
#!/usr/bin/perl
# Вызов скрипта с помощью SSI:
# &lt;!--#include virtual="/cgi-bin/time.pl"--&gt;
# или &lt;!--#exec cgi="/cgi-bin/time.pl"--&gt;
#
# Настройка локального времени<xmp>

$timeoffset = 0;
&get_date;


$format = <<EOF;

<font face="tahoma" size="1" color="#000000">
<center>
<b>
<ACRONYM TITLE="$hy $month $year года, $day $hour:$min $ampm Московское время">
$day, $date $month </ACRONYM></b>
</center>
</font>
EOF

sub get_date {

@days = ('Воскресенье','Понедельник','Вторник','Среда','Четверг','Пятница','Суббота');
@months = ('января','февраля','марта','апреля','мая','июня','июля','августа','сентября');
@months=(@months,'октября','ноября','декабря');

($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time + (3600*$timeoffset));

 $hour = "0$hour" if ($hour < 10);
 $min = "0$min" if ($min < 10);
 $sec = "0$sec" if ($sec < 10);

 if ($hour >= 12) { $variable = "P.M.";
 } else { $variable = "A.M."; }
 if ($hour == 0) { $hour = 12; }
 if ($hour > 12) { $hour -= 12; }

 $year = 1900 + $year;

 if ($mday eq "1") { $hy = "Первое";
 } elsif ($mday eq "2") { $hy = "Второе";
 } elsif ($mday eq "3") { $hy = "Третье";
 } elsif ($mday eq "4") { $hy = "Четвертое";
 } elsif ($mday eq "5") { $hy = "Пятое";
 } elsif ($mday eq "5") { $hy = "Шестое";
 } elsif ($mday eq "7") { $hy = "Седьмое";
 } elsif ($mday eq "8") { $hy = "Восьмое";
 } elsif ($mday eq "9") { $hy = "Девятое";
 } elsif ($mday eq "10") { $hy = "Десятое";
 } elsif ($mday eq "11") { $hy = "Одиннадцатое";
 } elsif ($mday eq "12") { $hy = "Двенадцатое";
 } elsif ($mday eq "13") { $hy = "Тринадцатое";
 } elsif ($mday eq "14") { $hy = "Четырнадцатое";
 } elsif ($mday eq "15") { $hy = "Пятнадцатое";
 } elsif ($mday eq "16") { $hy = "Шестнадцатое";
 } elsif ($mday eq "17") { $hy = "Семнадцатое";
 } elsif ($mday eq "18") { $hy = "Восемнадцатое";
 } elsif ($mday eq "19") { $hy = "Девятнадцатое";
 } elsif ($mday eq "20") { $hy = "Двадцатое";
 } elsif ($mday eq "21") { $hy = "Двадцать первое";
 } elsif ($mday eq "22") { $hy = "Двадцать второе";
 } elsif ($mday eq "23") { $hy = "Двадцать третье";
 } elsif ($mday eq "24") { $hy = "Двадцать четвертое";
 } elsif ($mday eq "25") { $hy = "Двадцать пятое";
 } elsif ($mday eq "26") { $hy = "Двадцать шестое";
 } elsif ($mday eq "27") { $hy = "Двадцать седьмое";
 } elsif ($mday eq "28") { $hy = "Двадцать восьмое";
 } elsif ($mday eq "29") { $hy = "Двадцать девятое";
 } elsif ($mday eq "30") { $hy = "Тридцатое";
 } elsif ($mday eq "31") { $hy = "Тридцать первое";
 } else { $hy = "th"; }

$day = $days[$wday];
$month = $months[$mon];
$month_No = ++$mon;
$date = "$mday";
$ampm = "$variable";

} #end get_date

print ("Content-type: text/html\n\n");
print "$format\n";

Счетчик посещений

Автор:			Cleric ICN (Россия)
WEB:			http://pgbook.dax.ru
E-mail:			clerical@mail.ru
Состав скрипта:		4 файла
Качество исполнения:	9
pcount.pl


#!/usr/bin/perl -w
use strict;
print "Content-type: text/html\n\n";

my($database,$countstat,@stat,$hosttime,$templ,$i);

$database= "pcount.db";
$countstat="pcstat.db";
$hosttime=31;
$templ="pctempl.db";

sub iplog{
my($ip,$time,@data,$FlagIp,$cell);
$FlagIp=0;$cell=0;

open (DB,"$database") || print "файл $database не найден";
flock (DB,1);
@data=<DB>;
close DB;
for($i=0;$i<=scalar(@data)-1-$cell;$i++){
 ($ip,$time)=split(/ /,$data[$i]);
 if ($time<time){shift(@data);$cell++}else{last}
}
for($i=0;$i<=scalar(@data)-1;$i++){
 ($ip,$time)=split(/ /,$data[$i]);
 if ($ENV{'REMOTE_ADDR'} eq $ip){$FlagIp=1;last}
}
open (DB,">$database") || print "файл $database не найден";
flock (DB,2);
chomp $data[scalar(@data)-1];
print DB @data;
if ($FlagIp==0){
 print DB "\n$ENV{'REMOTE_ADDR'} ",(time+3600*24*$hosttime);
}
close DB;
return $FlagIp;
}

sub host($){
my($time,$hosts);
($hosts,$time)=split(/ /,$stat[2]);
if ($time<time){
until ($time>time)
{$time+=3600*24;}
 print DBS "0 ",$time,"\n";
 print DBS "0";
}else{
 print DBS $hosts+$_[0];
 print DBS " $time\n";
 print DBS $stat[3]+1;
}
}

open (DBS,"$countstat") || print "файл $countstat не найден";
flock (DBS,1);
@stat=<DBS>;
close DBS;
chomp @stat;
open (DBS,">$countstat") || print "файл $countstat не найден";
flock(DBS,2);
print DBS $stat[0]+1,"\n";
if (&iplog==0){
 print DBS $stat[1]+1,"\n";
 &host(1);
}else{
 print DBS $stat[1],"\n";
 &host(0);
}
close DBS;

sub templ{
my (@tbase);
open (DBS,"$countstat") || print "файл $countstat не найден";
flock(DBS,1);
@stat=<DBS>;
close DBS;
chomp @stat;

open (TP,"$templ") || print "файл $templ не найден";
flock (TP,1);
@tbase=<TP>;
close TP;

$stat[2] =~ s/(\d+) \d+/$1/;

foreach $i(@tbase){
 $i =~ s/<!-- host -->/$stat[1]/g;
 $i =~ s/<!-- todayhost -->/$stat[2]/g;
 $i =~ s/<!-- visits -->/$stat[0]/g;
 $i =~ s/<!-- todayvisits -->/$stat[3]/g;
}
print @tbase;
}
&templ;
pcount.db

127.0.0.6 1040915680
pcstat.db
	
149
7
1 10800
107
pctempl.db


<style>
.pcount{background-position: left top;background-repeat: no-repeat;font-family:
 small fonts; color: yellow;font-size: 6pt}
.pccell{background-position: bottom;background-repeat: repeat-x}
</style>
<table border="0" cellpadding="0" cellspacing="0" width="88" height="31"
 background="- tppabs="<"/xmp><b>http://power.ru/bg.gif</b><xmp>" class="pcount">
<tr><td align="right" valign="center" class="pccell" background="- tppabs="<"/xmp><b>http://power.ru/pic.gif</b><xmp>">
<p style="margin-right: 3px;font-size: 6pt">
<font color="FFFFCC"><!-- visits --></font></p>
</td></tr><tr><td align="right" valign="center">
<p style="margin-right: 3px;font-size: 6pt"><!-- todayvisits --><br>
<!-- todayhost -->
</p>
</td></tr>
</table>

Пример работы такого скрипта:

Скрипт помещается в HTML документ с помощью SSI.

Ну, попробую объяснить как это работает. :-\

Файл pcount.pl

5 - объявление глобальных переменных
7,8,10 - установка путей к файлам, где хранятся данные скрипта.
9 - установка времени, в днях, в течении которого определенный IP адрес не считается уникальным (не считается хостом).
12 - объявление функции iplog.
14 - обнуление всех флагов функции.
16,17 - открытие и "залочивание" файла базы IP адресов.
18 - считывание файла в массив @data.
20-23. Физический смысл цикла: удаление всех IP адресов, "возраст" которых старше 31 (в данном случае) дня.
24-27. Проверка вхождения IP адреса пользователя в базу данных. Если IP входит, значит это НЕ уникальный пользователь.
28-31. Запись обработанной базы обратно в свой файл.
32-34. Если флаг опущен, т.е. пользователь является уникальным, его IP записывается в последнюю строку базы.
36 - функция возвращает значение флага.

39 - объявление функции host. Функция готова принять один параметр.
41 - сепарация 3-ей строки информационного файла.
42-46. Проверка, не выходит ли статистика "за сегодня" за рамки одних суток. Если выходят, данные статистики обнуляются. Выставляется дата следующего срока очистки данных.
48-50. Если за рамки ничего не выходит, к количеству уникальных пользователей прибавляется переданное число, а количество открываний страниц "за сегодня" увеличивается на 1.

54-57. Открывается информационный файл и считывается в массив @stat.
61 - количество открываний страниц увеличивается на 1.
62-64. Проверка, если пользователь уникален, увеличивается число уникальных пользователей и вызывается функция host с параметром 1.
66-67. Иначе число хостов остается прежним и вызывается функция host с параметром 0.

71 - объявление функции templ.
79-82. Считываем шаблон счетчика.
84 - очищение значения кол-ва хостов "за сегодня" от даты "срока годности".
86-91. Обрабатываем файл шаблона и заменяем все авто подставляемые значения. А-ля SSI.
92 - вывод на страницу пользователя текстового изображения счетчика.
94 - запуск функции templ.


Гостевая книга

Автор:			Юрин Андрей (Россия)
WEB:			http://www.eliz.ru
Состав скрипта:		2 файла
Качество исполнения:	8
gk.pl

#!/usr/local/bin/perl
#############################################################################
# Гостевая книга ver 1.0 	 	 #
# Написан Юриным Андреем 26.08.98 #
# Вы можете направлять свои пожелания и вопросы на webmaster@eliz.ru #
# ИЛИ ЧЕРЕЗ СЕРВЕР http://www.eliz.ru		 #
#############################################################################

##################################################
# Определение переменных:
##################################################

# URL файла гостевой книги
$guestbookurl = "http://power.ru/gk.htm";

# URL файла стилей
$styles_url = "http://power.ru/styles.css";

# Настоящий путь файлу гостевой униги
$guestbookreal = "../WWW/guestbook.htm";

# URL исполняемого .pl файла гостевой книги
$cgiurl = "/cgi-bin/gk.pl";

&parse_form;
sub parse_form {
	if ($ENV{'REQUEST_METHOD'} eq "POST") {$mode = 0}
	if ($ENV{'REQUEST_METHOD'} eq "GET") {$mode = 1}
	if ($mode == 0) {read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'})}
	if ($mode == 1) {$buffer = $ENV{'QUERY_STRING'}}
	@pairs = split(/&/, $buffer);
	foreach $pair (@pairs) {
		($name, $value) = split(/=/, $pair);
		$value =~ tr/+/ /;
		$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
		$FORM{$name} = $value;
	}
}


&no_name("Вы не указали Ваш комментарий!") unless $FORM{'comments'};
&no_name("Вы не указали Ваше имя") unless $FORM{'realname'};

open (FILE,"$guestbookreal");
@LINES=<FILE>;
close(FILE);
$SIZE=@LINES;


open (GUEST,">$guestbookreal");
for ($i=0;$i<=$SIZE;$i++) {
	$_=$LINES[$i];
	if (/<!--go_write-->/) { 
		print GUEST "<!--go_write-->\n";
		$FORM{'comments'} =~ s/\cM\n/<br>\n/g;
		print GUEST "<b>$FORM{'comments'}</b><br>\n";
		if ($FORM{'url'}) {
			print GUEST "<a href="javascript:if(confirm('http://pgbook.dax.ru/%22$FORM{\'url\'}/%22 \n\nThis file was not retrieved by Teleport Pro, because it is addressed on a domain or path outside the boundaries set for its Starting Address. \n\nDo you want to open it from the server?'))window.location='http://pgbook.dax.ru/"$FORM{\'url\'}/"'" tppabs="http://pgbook.dax.ru/"$FORM{'url'}/"">$FORM{'realname'}</a>";
		} else {
			print GUEST "$FORM{'realname'}";
		}
		if ( $FORM{'username'} ){
			print GUEST " \&lt;<a href="javascript:if(confirm('http://pgbook.dax.ru/%22mailto:$FORM{\'username\'}/%22 \n\nThis file was not retrieved by Teleport Pro, because it is addressed on a domain or path outside the boundaries set for its Starting Address. \n\nDo you want to open it from the server?'))window.location='http://pgbook.dax.ru/"mailto:$FORM{\'username\'}/"'" tppabs="http://pgbook.dax.ru/"mailto:$FORM{'username'}/"">";
			print GUEST "$FORM{'username'}</a>\&gt;";
		}
		print GUEST "<br>\n";
		if ( $FORM{'city'} ){
			print GUEST "$FORM{'city'},";
		}
		if ( $FORM{'country'} ){
			print GUEST " $FORM{'country'}";
		}
		print GUEST " - $date<hr size=\"1\" width=\"90%\">\n\n";
	} else {
			print GUEST $_;
	}
}
close (GUEST);



&print_head("Ваш комментарий добавлен!");
print "<h1 align=center>Ваш комментарий добавлен!</h1><br>\n"; 
print "Данные, введенные вами, добавлены в гостевую книгу:<br>\n"; 
print "<table border=\"1\">\n"; 
print "<tr>\n"; 
print "<td>Ваше имя</td>\n"; 
print "<td>\n"; 
print "$FORM{'realname'}</td>\n"; 
print "</tr>\n"; 
print "<tr>\n"; 
print "<td>E-mail</td>\n"; 
print "<td>\n"; 
print "$FORM{'username'}</td>\n"; 
print "</tr>\n"; 
print "<tr>\n"; 
print "<td>Домашняя<br>\n"; 
print "страничка</td>\n"; 
print "<td>\n"; 
print "$FORM{'url'}</td>\n"; 
print "</tr>\n"; 
print "<tr>\n"; 
print "<td colspan=\"2\">Город:\n"; 
print "$FORM{'city'},\n"; 
print "Страна:\n"; 
print "$FORM{'country'}\n"; 
print "</td>\n"; 
print "</tr>\n"; 
print "<tr>\n"; 
print "<td>Комментарии:</td>\n"; 
print "<td>$FORM{'comments'}</td>\n"; 
print "</tr>\n"; 
print "</table>\n"; 
print "<p><a href="javascript:if(confirm('http://pgbook.dax.ru/%22$guestbookurl/%22 \n\nThis file was not retrieved by Teleport Pro, because it is addressed on a domain or path outside the boundaries set for its Starting Address. \n\nDo you want to open it from the server?'))window.location='http://pgbook.dax.ru/"$guestbookurl/"'" tppabs="http://pgbook.dax.ru/"$guestbookurl/"">Вернуться в гостевую книгу</a></p>";
&print_end;


sub no_name {
&print_head($_[0]);
print "<h1 align=center>$_[0]</h1><br>\n"; 
print "<form action="http://pgbook.dax.ru/"$cgiurl/"" method=\"POST\">\n"; 
print "<table border=\"0\">\n"; 
print "<tr>\n"; 
print "<td>Ваше имя</td>\n"; 
print "<td><input type=\"text\" size=\"23\"\n"; 
print "name=\"realname\" value=\"$FORM{'realname'}\"></td>\n"; 
print "</tr>\n"; 
print "<tr>\n"; 
print "<td>E-mail</td>\n"; 
print "<td><input type=\"text\" size=\"23\"\n"; 
print "name=\"username\" value=\"$FORM{'username'}\"></td>\n"; 
print "</tr>\n"; 
print "<tr>\n"; 
print "<td>Домашняя<br>\n"; 
print "страничка</td>\n"; 
print "<td><input type=\"text\" size=\"23\"\n"; 
print "name=\"url\" value=\"$FORM{'url'}\"></td>\n"; 
print "</tr>\n"; 
print "<tr>\n"; 
print "<td colspan=\"2\">Город: <input\n"; 
print "type=\"text\" size=\"15\" name=\"city\" value=\"$FORM{'city'}\">,\n"; 
print "Страна: <input type=\"text\"\n"; 
print "size=\"15\" name=\"country\" value=\"$FORM{'country'}\"\n"; 
print "</td>\n"; 
print "</tr>\n"; 
print "<tr>\n"; 
print "<td colspan=\"2\">Комментарии:<br>\n"; 
print "<textarea name=\"comments\" rows=\"6\"\n"; 
print "cols=\"40\">$FORM{'comments'}</textarea></td>\n"; 
print "</tr>\n"; 
print "<tr>\n"; 
print "<td align=\"center\"><font size=\"2\"><input\n"; 
print "type=\"submit\"\n"; 
print "value=\"ДОБАВИТЬ\"></font></td>\n"; 
print "<td><font size=\"2\"><input\n"; 
print "type=\"reset\" value=\"ОЧИСТИТЬ\"></font></td>\n"; 
print "</tr>\n"; 
print "</table>\n"; 
print "</form>\n"; 
&print_end;
exit;
}

sub print_head {
	print "Content-type: text/html";
	print "\n\n";
	print "<html><head>"; 
	print "<title>$_[0]</title>\n"; 
	print "<link rel=\"STYLESHEET\" type=\"text/css\" href="javascript:if(confirm('http://pgbook.dax.ru/%22$styles_url/%22 \n\nThis file was not retrieved by Teleport Pro, because it is addressed on a domain or path outside the boundaries set for its Starting Address. \n\nDo you want to open it from the server?'))window.location='http://pgbook.dax.ru/"$styles_url/"'" tppabs="http://pgbook.dax.ru/"$styles_url/""></head>\n";
	print "<body bgcolor=\"white\" topmargin=0 marginheight=0>\n";
}


sub print_end {
	print "<div align=center>Спасибо за отзыв!</div></body></html>\n";
}
gk.htm

<html>

<head>
<title>Гостевая книга by Yurin Andrey</title>
<link rel="STYLESHEET" type="text/css" href="javascript:if(confirm('http://www.wallst.ru/err/error.phtml?err=404 \n\nThis file was not retrieved by Teleport Pro, because it is addressed on a domain or path outside the boundaries set for its Starting Address. \n\nDo you want to open it from the server?'))window.location='http://www.wallst.ru/err/error.phtml?err=404'" tppabs="styles.css">
</head>
<body bgcolor="white" topmargin="0" marginheight="0">
<h1 align="center">ГОСТЕВАЯ КНИГА</h1> <p>Заполните форму и тогда ваш
 комментарий окажется в нашей гостевой книге. Большое спасибо.</p>

<form action="http://pgbook.dax.ru/cgi-bin/gk.pl" method="POST">

<table border="0">
<tr>
 <td>Ваше имя</td>
<td><input type="text" size="23" name="realname"></td>
</tr>
<tr>
 <td>E-mail</td>
<td><input type="text" size="23"
 name="username"></td>
</tr>
<tr>
 <td>Домашняя<br>
 страничка</td>
<td><input type="text" size="23" name="url"></td>
</tr>
<tr>
 <td colspan="2">Город: <input type="text" size="15" name="city">, Страна:
 <input type="text" size="15" name="country" value="Россия"></td>
</tr>
<tr>
 <td colspan="2">Комментарии:<br>
 <textarea name="comments" rows="6" cols="40"></textarea></td>
</tr>
<tr>
 <td align="center"><font size="2"><input type="submit" value="ДОБАВИТЬ"></font></td>
<td><font size="2"><input type="reset" value="ОЧИСТИТЬ"></font></td>
</tr>
</table>
</form>
</td>
</tr>
</table>
</center></div><div align=center>Гостевая книга написана
 <a href="mailto:webmaster@eliz.ru">Юриным Андреем</a></div>
<hr size="5" width="80%" color="#BF95FF">
<p align="center">ВАШИ КОММЕНТАРИИ:</p><p align="left">
<!--go_write-->



</p>
</body>
</html>	

Работа скрипта:

14-23. Определение переменных.
25-38. Объявление и вызов функции, разделяющей форму.
41 - вызов функции no_name с параметром, если пользователь не заполнил поле формы "комментарий".
42 - -//- "настоящее имя".
44-47. Чтения HTML файла гостевой книги, запись его в массив.
50 - открытие для чтения HTML файла.
51-77. Перебор в цикле файла гостевой книги. Если текущая строка не содержит строки комментария <!--go_write-->, выполняется запись строки без изменения. Иначе выполняется ввод "<!--go_write-->" и переданных полей формы.
78 - закрытие файла.
82 - вызов функции print_head с параметром.
83-114. Печать введенных данных.
115 - вызов подпрограммы print_end.
118-162. Объявление и вызов процедуры сообщения об ошибках.
164-276. Объявление процедур вывода заголовка страницы и нижней её части.

[Содержание]  [Вступление]  [необходимое для начала изучения]  [урок 1]  [урок 2]  [урок 3]  [урок 4]  [урок 5]  [урок 6]  [урок 7]  [урок 8]  [урок 9]  [урок 10]  [урок 11]  [урок 12]  [урок 13]  [урок 14]  [урок 15]  [урок 16]  [урок 17]  [урок 18]  [урок 19]  [урок 20]  [урок 21]  [урок 22]  [урок 23]  [урок 24]  [урок 25]  [урок 26]  [урок 27]  [урок 28]  [правила хорошего тона]  [приложение A]  [приложение Б]  [приложение В]  [заключение]  [благодарности] 


107644

105
15

HOLMS.ru Counter -эфхъё ЎшЄшЁютрэш  Counter CO.KZ


Copyright © ClericICN, 2002 - 2003