Простейшая гостевая книга на Perl.

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

Вот весь код программы:

#!/usr/bin/perl

$path = "bd.txt";
$this_file = "/index.html";
print "Content-Type: text/html\n\n";

use CGI qw (:standard);
$cg=new CGI();

$if_post = $cg->param (if_post);
&post if ($if_post eq 'yes');

&printall;

sub post
{
$nick = $cg->param(nick);
$message = $cg->param(message);
$time = localtime;

$message =~ s/<(.{1,10})>//g;
$message =~ s/\n/<br>/g;

$to_file = "$nick \@\@  $message \@\@ $time\n";
open (OUT_F, ">>$path");
print OUT_F $to_file;
close (OUT_F);
}

sub printall
{
open (INPUT, "<$path");
@text = <INPUT>;
close (INPUT);
for ($z1=$#text; $z1>=0; $z1--)
{
($time, $nick, $message)=split (/ \@\@ /, $text [$z1]);
print "$nick ($time):<br>$message<br><br>";
}
print "
<form action=$this_file method=get>
Nick: <input name=nick><br>
Message: <TEXTAREA ROWS=15 COLS=50 name=message></TEXTAREA><br>
<input name=if_post value=yes type=hidden>
<input type=submit value=Îòïðàâèòü>
</form>
";
}

А теперь разберем его построчно.

Самая главная часть перл программы - строка: #!/usr/bin/perl . Именно она указывает веб-серверу, откуда брать интерпретатор.

Следующая строки:

$path = "bd.txt";
$this_file = "/index.html";

указывают путь к файлам в которых хранится база сообщений оставленных пользователями ($path) и путь к файлу самой гостевой книги, из которой вызывается скрипт ($this_file).
print "Content-Type: text/html\n\n";

Выводит заголовок, который необходим, для того, чтобы браузер мог понять, что перед ним веб-страница.
use CGI qw (:standard); $cg=new CGI();

Подключаем модуль CGI, и создаем объект, через которого мы будем использовать функции этого модуля.
$if_post = $cg->param (if_post);
&post if ($if_post eq 'yes');

Получаем значения параметра формы if_post, и если он равен yes', то выполняем функцию post(что это за функция - расскажу немного дальше).
&printall;

Вызываем функцию, которая выводит файл с сообщениями оставленными пользователями, и форму для отправки сообщений.
sub post {

Объявляем функцию post.
$nick = $cg->param(nick);
$message = $cg->param(message);
$time = localtime;

Получаем данные формы - nick, message, и записываем их в одноименные переменные. А время(и дату) записываем в переменную $time.
$message =~ s/<(.{1,10})>//g;
$message =~ s/\n/<br>/g;

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

$to_file = "$nick \@\@ $message \@\@ $time\n";
open (OUT_F, ">>$path");
print OUT_F $to_file;
close (OUT_F);

Собираем все 3 параметра в одну переменную по шаблону : ник @@ сообщение @@ время+переход на следующую строку. Открывается файл $path (символы ">>" означают, что файл открывается на добавление. $to_file пишется в файл OUT_F. Файл закрывается.
}

Закрывается объявление функции.
sub printall
{

Объявляется функция printall.
open (INPUT, "<$path");
@text = <INPUT>;
close (INPUT);

Открывается файл $path (символ "<" означает, что файл открывается только на чтение). Содержание этого файла копируется в переменную(массив) @text. Файл закрывается.
for ($z1=$#text; $z1>=0; $z1--)
{
($time, $nick, $message)=split (/ \@\@ /, $text [$z1]);
print "$nick ($time):<br>$message<br><br>";
}

В цикле, каждая строка разделяется на 3 части и копируется соответственно в 3 переменные $time, $nick, $message ( последняя часть копируется в первую.
print "
<form action=$this_file method=get>
Nick: <input name=nick><br>
Message: <TEXTAREA ROWS=15 COLS=50 name=message></TEXTAREA><br>
<input name=if_post value=yes type=hidden>
<input type=submit value=Ioi?aaeou>
</form>
";

Выводится форма.
}

Закрывается объявление функции.