» Главная
eXcode.ru » Статьи » Perl
» Новости
» Опросы
» Файлы
» Журнал



Пользователей: 0
Гостей: 9





Форум на Perl.




Автор: Ковязин Дмитрий, P-Lib(p-lib.narod.ru)
Форум.

Форумы в Интернете можно встретить сплошь и рядом.Ни один уважающий себя сайт не обходится без них. Форум дает возможность узнать мнение посетителей о сайте и о том,что они думают об авторе и о его творениях :). Форум,пример которого я здесь приведу не очень сложный,но он обеспечивает все необходимые функции.Для лучшего понимания имеет смысл разбить его на несколько частей,объяснить каждую в отдельности,а затем объединить все вместе.

Данный форум состоит из следующих частей:

* Главная страница-вывод списка топиков.
* Создание нового топика и запись в файл.
* Создание ответа на топик и запись в файл.

Начнем не с главной страницы,потому что она обобщает всю информацию,а с середины-добавления нового топика.

Добавление нового топика.

Сначала в директории cgi-bin веб-сервера создадим каталог html,куда будут записываться все сообщения. Сразу оговорюсь,что все сообщения пишутся в html-файл:сначала топик и сообщение,затем к нему дописываются ответы. По ходу дела все будет понятно.
Сгенерируем форму для добавления новой темы и сообщения.



#!/usr/local/bin/perl
#Webforum.cgi version 1.01
$request=$ENV{′REQUEST_METHOD′};
$content=$ENV{′CONTENT_LENGTH′};

$cgi="url/cgi-bin";
$url="url/cgi-bin/html";
$dir="/usr/local/apache/cgi-bin/html";

print "Content-type:text/htmlnn";
print <<HTML;
<html><head><style>a:link {text-decoration:none; }</style></head><body>
<h4 align=center><font color="0000ff">New topic</font></h4>
<p align=right><a href="$cgi/webforum.cgi"><font face="ferdana" size=3>
Home</font></a>
<p><form action="$cgi/webforum.cgi" name="newtop" method="GET">
<table width=60% align=center bgcolor="e6e8fa">
<tr><td>
<tr><td>Your nick:<td><input type="text" name="nick" size=20>
<tr><td>Topic name:<td><input type="text" name="theme" size=20>
<tr><td><input type="hidden" name="action" value="ok">
<tr><td colspan=2> Message:<p>
<textarea cols=40 rows=15 name="post" wrap="virtual"></textarea>
<tr><td colspan=2><input type="submit" value="Submit"></table>
HTML


Если данные введены в форму получаем их и декодируем.



@pairs = split(/&/, $query);
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
$name =~ tr/+/ /;
$name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$name =~ s///g;
$name =~ s/<([^>]|n)*>//g;
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$value =~ s///g;
$value =~ s/</</g;
$value =~ s/>/>/g;
$value =~ s/cM/ /g;
$value =~ s/|/ /g;
$value =~ tr/ / /s;
$value =~ s/<([^>]|n)*>//g;
$value =~ s/"/"/g;
$value=~s/(http://+S)/<A href="$1">$1</A>/g;
$input{$name} = $value;
}

$nick=$input {′nick′};
$theme=$input {′theme′};
$message=$input {′post′};

#Create new topic.


#Открываем каталог и читаем его содержимое. Файлы в каталог записываются в виде #001.html,002.html и т.д.То есть,каждый вновь записываемый файл,увеличивается #на единицу.Это делается следующим образом.


opendir (DIR,"$dir");
while (@mes=readdir (DIR)) {
foreach $mes(@mes) {
$count=@mes;
$count++;
$page="00".($count-2);
}


# ($count-2)-это для того,чтобы не считать подкаталоги типа "." и "..". # Проверяем,не являются ли поля формы пустыми. Если нет-открываем файл на запись # и пишем информацию.


if ($nick ne "" && $theme ne "" && $message ne "") {
open (FILE,">$dir/$page.html");
print FILE "<html><head><style>
a:link {text-decoration:none; } </style><title>$theme</title>n";
print FILE "<meta name="author" content="$nick"></head>n";
print FILE "<body bgcolor="f6f8fa">n";
print FILE "<p align=right><a href="$cgi/webforum.cgi?action=reply&file=$page.html">n";
print FILE "<font face="ferdana" size=3>Post reply</font></a>n";
print FILE " <a href="$cgi/webforum.cgi"><font face="ferdana" size=3>
Home
</font></a><p>n";
print FILE "<table width=90% cellpadding=0 cellspacing=0 border=1>n";
print FILE "<tr><td align=center width=150 bgcolor="D5E6E1"><
font face="Arial" size=2 color="808080">Author</font>n";
print FILE "<td bgcolor="D5E6E1"><font face="serif" size=2 color="0000ff">Topic:</font>n";
print FILE "<font face="serif" size=2 color="ff0000">$theme</font></td></tr>n";
print FILE "<tr><td rowspan=2 bgcolor="D5E6E1" align=center>
<font face="serif" size=3 color="ff0000">$nick</font></td>n";
print FILE "<td bgcolor="e6e8fa" height=30>
<font face="serif" size=1 color="000080">Posted:",scalar localtime,"</font></td></tr>n";
print FILE "<tr><td bgcolor="f7f7f7"><font face="serif" size=2 color="000080">
$message</font></td></tr></table>n";
close (FILE);
} else {


#Если одно из полей формы осталось пустым-выдаем ошибку.Это делается для того,чтобы # не создавать пустые файлы,не содержащие информации.Perl′у все равно,что писать :)


print "Content-type:text/htmlnn";
print <<HTML;
<p>
<p>
vp>
<body bgcolor="e6e8fa">
<h4 align=center>Sorry,you didn′t enter your nick or message! </h4>
<p><center>Please,go back and try again
<p><a href="$cgi/webforum.cgi?action=newtop"><font face="ferdana" size=3>
Back</font></a>
</center>
HTML
exit;
}
}
closedir (DIR);
}


# Если все прошло нормально,выносим пользователю благодарность.Новый топик создан.


print "Content-type:text/htmlnn";
print <<HTML;
<p>
<p>
<p>
<body bgcolor="e6e8fa">
<h4 align=center>Thank you,<font color="0000ff">$nick!</font></h4>
<p><center>Your message is added.
<p><a href="$cgi/webforum.cgi"><font face="ferdana" size=3>
View topics</font></a></center>
HTML
</BODY>
</HTML>
HTML



Добавление ответа на топик.

Добавление ответа почти ничем не отличается от добавления топика,единственное отличие- нужно передать адрес страницы,чтобы скрипт знал,куда писать ответ.А он содержится в файле топика.Если посмотреть чуть выше,можно увидеть ссылку <a href="$cgi/webforum.cgi?action=reply&file=$page.html">Post reply</a> В ней и передается адрес страницы.
Генерируем форму:



# Сначала читаем файл в массив.Это делается для того,чтобы поместить его во фрейм ниже формы # на тот случай,если кто-то захочет вставить цитату из предыдущих сообщений.

$page=$input {′file′};

open (FILE,"$dir/$page");
@data=<FILE>;
close (FILE);

print "Content-type:text/htmlnn";
print <<HTML;
<html><head><style>a:link {text-decoration:none; }</style></head><body>
<h4 align=center><font color="0000ff">Post reply</font></h4>
<p align=right><a href="$cgi/webforum.cgi">
<font face="ferdana" size=3>Home</font></a>
<p><form action="$cgi/webforum.cgi" name="reply" method="GET">
<table width=60% align=center bgcolor="e6e8fa">
<tr><td>
Your nick:<td>vinput type="text" name="nick" size=20>
<tr><td><input type="hidden" name="type" value="reply">
<tr><td><input type="hidden" name="action" value="ok">
<tr><td><input type="hidden" name="file" value="$page">
<tr><td colspan=2> Message:<p>
<textarea cols=40 rows=15 name="post"></textarea>
<tr><td colspan=2><input type="submit" value="Submit"></table>
<p><center><iframe src="$dir/$page" width=90% height=300></iframe></center>
HTML

#Reply to topic.

# Снова проверяем,чтобы поля формы не были пустыми. Если все в порядке,открываем файл, # содержащий топик на добавление и дописываем ответ.


if ($nick ne "" && $message ne "" ) {
open (FILE,">>$dir/$page");
print FILE "<table width=90% cellpadding=0 cellspacing=0 border=1>n";
print FILE "<tr><td rowspan=2 bgcolor="f7f7f7" align=center width=150>
<font face="serif" size=3 color="0000ff">$nick</font></td>n";
print FILE "<td bgcolor="e6e8fa" height=30><font face="serif" size=1 color="000080">
Posted:",scalar localtime,"</font></td></tr>n";
print FILE "<tr><td bgcolor="f7f7f7"><font face="serif" size=2>
$message</td></tr></table>n";
close (FILE);
close (FILE);
} else {

# Если одно из полей осталось пустым-выдаем ошибку.


print "Content-type:text/htmlnn";
print <<HTML;
<p>
<p>
<p>
<body bgcolor="e6e8fa">
<h4 align=center>Sorry,you didn′t enter your nick or message! </h4>
<p><center>Please,go back and try again
<p><a href="$cgi/webforum.cgi?action=reply&file=$page.html">
<font face="ferdana" size=3>Back</font></a>
</center>
HTML
exit;
}

# Снова выносим благодарность посетителю.Ответ добавлен.


print "Content-type:text/htmlnn";
print <<HTML;
<p>
<p>
<p>
<body bgcolor="e6e8fa">
<h4 align=center>Thank you,<font color="0000ff">$nick!</font></h4>
<p><center>Your message is added.
<p><a href="$cgi/webforum.cgi"><font face="ferdana" size=3>
View topics</font></a></center>
HTML
</BODY>
</HTML>
HTML



Главная страница.

Ну вот мы,наконец,добрались и до главной страницы.Она выводит список топиков,дату последнего ответа на каждый топик,количество ответов,имя создателя топика.Она заслуживает отдельного описания.

Данные на экран выводятся в виде html-таблицы.



print "Content-type:text/htmlnn";
print <<HTML;
<html><head><title>Webforum ver1.01</title>
<style>a: {text-decoration:none; } </style></head>
<body bgcolor="e6e8fa">
<p>
<p><h4 align=center><font color="0000ff">Webforum</font></h4>
<p align=right><a href="$cgi/webforum.cgi?action=newtop">
<font face="ferdana" size=3>New topic</font></a>
<p><table width=700 cellpadding=0 cellspacing=0 border=1>
<tr bgcolor="D5E6E1"><td align=center width=300 height=50>
<font face="arial" size=2 color="0000ff">Topic name</font></td>
<td align=center width=150 height=50><font face="arial" size=2 color="0000ff">
Topic starter</font></td>
<td align=center width=50 height=50>
<font face="arial" size=2 color="0000ff">Replies</font></td>
<td align=center width=200 height=50>
<font face="arial" size=2 color="0000ff">Last post</font></td></tr>
HTML

# С этим,думаю,все понятно.А теперь более подробно о том, как получить всю эту информацию. # Открываем каталог и читаем сообщения в массив.


opendir (DIR,"$dir");
while (@mes=readdir(DIR)) {
foreach $mes (@mes) {

# Каждый файл в каталоге открываем и читаем в массив.

if (!-d "$dir/$mes" && "$mes" ne "." && "$mes" ne "..") {
$mtime=localtime((stat("$dir/$mes"))[9]);

open (FILE,"$dir/$mes");
@lines=<FILE>;
close (FILE);

# Теперь в каждом файле с помощью регулярных выражений ищем тему топика,имя автора топика # и количество ответов.


foreach $line (@lines) {
if ($line=~ /<title>(.*?)</title>/is) {
$title=$1;
}
if ($line=~ /content="(.*?)"/is) {
$name=$1;
}

# Количество ответов помещаем в массив reply,отнимая единицу,так как первое сообщение-это # сообщение автора топика.


if ($line=~ /^<table(s*)(.*?)>$/i) {
$reply=$1;
push (@reply,$reply);
$char=@reply-1;
}
}

# Печатаем данные в таблицу,после каждой итерации очищая массив reply,чтобы ответы на # каждый топик не складывались после каждой итерации.


print <<HTML;
<tr bgcolor="f7f7f7"><td height=30><a href="$url/$mes">
<font face="serif" size=2>$title</font></a></td>
<td align=center height=30><font face="serif" size=2>$name</font></td>
<td height=30 align=center>$char</td>
<td height=30 align=center><font face="serif" size=2>$mtime</font></td></tr>
HTML
splice (@reply);
}
}
}

print "</table>n";
closedir (DIR);



Ну вот,вроде бы и все.

Конечно,я не реализовал все возможности.Можно добавить регистрацию пользователя,возможность редактирования сообщений и т.д.В дальнейшем я планирую доработать этот форум и сделать его более продвинутым. В данный момент моей целью было объяснить,как это работает.
К началу статьи





Добавил: MadvEXДата публикации: 2007-04-13 17:45:07
Рейтинг статьи:5.00 [Голосов 1]Кол-во просмотров: 18348

Комментарии читателей

Всего комментариев: 187

2018-01-31 00:38:39
Greyfsd
Возникли финансовые трудности?
- кредит личный кабинет
Выдача кредита онлайн на карту за 20 мин. Смотрите здесь: http://bit.ly/2or6zRB - кредит деньги
Список избранного
http://bit.ly/2v0XFcZ - взять деньги в долг под
*money**

2018-01-25 15:33:44
CPROSoizase
Сотрудники нашей фирмы Контроль проект предлагает такие услуги как сопровождение бань.Применяем в возведенье, работе по проектированию, сопровождение квартир такие виды строительных материалов как: дерево.

Мы компания Контроль проект помогут вам сделать верный выбор не только в проектирование но и в выборе стройматериалов для аудите многоквартирных домов, коттеджей. Всегданужно какой материал вы используете для бань ведь от выполнения этих функций зависит срок его использованию в целом.

Наши служащие обученные дадут возможность вам выгодно организовать ваш выбор по строительству беседки.

Мы находимся в г.Самара и работаем по всей всей территории России и за пределами России. Обращайтесь к нам, и мы вам обязательно поможем!

этапы получения исходно разрешительной документации: <a href=https://contrpro.ru/konsalting/ur-lica/pomoshh-v-podgotovke-ird-ishodno-razreshitelnoj-dokumentatsii-dlya-proektirovaniya/>перечень исходно разрешительной документации для строительства</a>

2018-01-23 10:09:21
sipsystemtiz
О контрацептивах...
онлайн-общение с кидалами - http://bit.ly/2EQfSxP#YhTTYWK2EP
не попадитесь

были оплачены услуги за регистрацию на сайте 2300р и +15 евро на баланс

на последующий день прояснилось, что объявленные на их же ресурсах услуги по факту не предоставляют
на просьбу отдать свои деньги просто .... мозг и ничего не возвратили.

через небольшое время невозможно зайти в акк и техподдержка на просьбу уладить проблему попросту игнорит

дай бог, если вы (техподдержка) это читаете, благословение на весь ваш кидальный бизнес, на все последующие годы-
чтоб вас также по жизни во всем все швыряли и люди знали какие вы непорядочные свиньи
чтоб поскорей загнулся ваш род и ваши кидальные сайты. дешевки.

переписка прилагается - http://bit.ly/2EQfSxP#nzz8EWtaSX

контакты мошенников
ICQ: 222-443 222443
Skype: www.sip-system.com
E-Mail: support@sip-system.com
Телефон, Telegram, Viber, WhatsApp: +79854165502
http://sipfake.ru/
support@sipfake.ru
1. http://podmenanomera.ru
2. http://sip-system.com
3. http://sipfake.ru
4. http://fakenumbers.net
5. http://nat-bank.ru
6. http://sip-system.net
7. http://vk.com/callerid
8. http://sip-ring.com/
9. http://sip-craft.ru/
10.http://caller-id.net
11.http://safeweber.ru
12.http://sip-exchange.com
----------------------
еще инфа по кидалам - https://forum.exploit.in/index.php?showtopic=67860
---------------------
написать смс с подменой номера бесплатно
как на мегафоне отправить смс с подменой номера
посылать смс с подменой номера
подмена номера программа на айфон
подмены номера

2017-12-19 22:09:49
AvitoR77Kl
<b>Пополение баланса Авито (Avito) за 50%</b> | <b>Телеграмм @a556677</b> Старый Телеграмм @a1garant НЕДЕЙСТВИТЕЛЕН

<b>Мое почтение, дорогие друзья!</b>

Рады будем предоставить Всем вам услуги по пополнению баланса на действующие активные аккаунты Avito (а также, абсолютно новые). Если Вам требуются определенные балансы - пишите, будем решать. Потратить можно на турбо продажи, любые платные услуги Авито (Avito).

<b>Аккаунты не Брут. Живут долго.</b>

Процент пополнения в нашу сторону и стоимость готовых аккаунтов: <b>50% от баланса на аккаунте.</b>
Если необходим залив на ваш аккаунт, в этом случае требуются логин и пароль Вашего акка для доступа к форме оплаты, пополнения баланса.
Для постоянных заказчиков гибкая система бонусов и скидок!

<b>Гарантия: </b>

<b>И, конечно же ничто не укрепляет доверие, как - Постоплата!!!</b> Вперед денег не просим...

Рады сотрудничеству!

<b>Заливы на балансы Авито</b>
________


2017-12-13 02:54:38
PeterDer
В известный во всём мире праздник «День Святого Валентина» влюблённые обмениваются фигурными открытками в виде сердечка, дарят друг другу конфеты, игрушки или другие подарки, которые подчеркивают символичность их любви и верности…, подробнее читайте на сайте <a href=http://fi-hi.ru>fi-hi.ru</a>

2017-11-29 17:19:28
Davidmox
Рекомендации и советы по лечению вирусных гепатитов у детей различного возраста. Дневники противовирусной терапии детей.

<a href=https://hcv-forum.ru/>даклатасвир применение</a>
<a href=https://hcv-forum.ru/>соф плюс лед</a>

https://hcv-forum.ru/ - софосбувир инструкция по применению цена
https://hcv-forum.ru/ - ledihep отзывы

2017-11-28 10:21:15
LobbertiRiz
Готовые Системы видеонаблюдения в магазин, запись круглосуточная со звуком. установка дополнительных микрофонов

<a href=http://video-stb.ru>установить магнитный замок на дверь</a>
<a href=https://www.video-stb.ru/catalog/magnitnye-zamki/>монтаж магнитного замка</a>

<a href=https://www.video-stb.ru/catalog/ustanovka-domofonov/>установка домофона в офис</a>

<a href=https://www.video-stb.ru/catalog/ustanovka-dvernykh-zamkov/>установка накладных замков</a>

<a href=https://www.video-stb.ru/catalog/elektromekhanicheskie-zashchelki/>электромеханический замок cisa</a>

2017-11-25 17:43:11
Larryanalm
В первую очередь укладывается металлическая сетка, к которой будет прикреплен нагревательный элемент. Перед заливкой стяжки, необходимо четко спланировать положение кабеля и его муфт, выходов под подключение электросети, регулятор и термостат, подробнее читайте на сайте <a href=http://remstroitelstvo.ru>remstroitelstvo.ru</a>

2017-11-22 18:53:32
GeorgeDow
Как туплекс, так и пробка обладают прекрасными параметрами, поэтому многие люди затрудняются с правильным выбором. Пробка является экологически чистой, однако опасается воздействия воды, подробнее читайте на сайте <a href=http://rempostroy.ru>rempostroy.ru</a>

2017-11-21 00:33:53
DonaldPrilm
Каркасная конструкция имеет негативное свойство выводить тепло накопившееся внутри помещения на улицу. Чтоб избежать подобных теплопотерь, или значительно уменьшить их показатели, рекомендуется подобрать подходящий утеплитель для каркасного дома, подробнее читайте на сайте <a href=http://omontazhe.ru>omontazhe.ru</a>
Ваше имя: *
Текст записи: *
Имя:

Пароль:



Регистрация

На каком хостинге расположен ваш сайт?
На платном зарубежном
5% (6)
На платном российском
14% (19)
На народе
15% (20)
На халявном с пхп и перлом
21% (28)
На localhost :)
18% (24)
А хостинг это че-то типа пудинга?
5% (6)
У меня нет сайта :(
23% (30)

Проголосовало: 133
Афоризм дня: Возвращается муж домой из Интернета...
Рейтинг: 8.5/10 (2)
Посмотреть все анекдоты