#!/usr/bin/perl -w use 5.004; use strict; # установить обновления и взятие в ковычки use CGI qw(:standard); # импортировать сокращения :standard use Fcntl qw(:flock); # импортировать LOCK_EX, LOCK_SH, LOCK_NB sub bail { # функция обработки ошибок my $error = "@_"; print h1("Непредвиденная ошибка"), p($error), end_html; die $error; } my ( $CHATNAME, # имя гостевой книги $MAXSAVE, # какое количество хранить $TITLE, # название и заголовок страницы @entries, # все текущие записи $entry, # одна конкретная запись $cur ); $TITLE = "Гостевая книга"; $CHATNAME = '/www/students/yas&man&ks/chatfile'; # где все это в системе находится $MAXSAVE =10; print header(), start_html(-title => $TITLE, -bgcolor=>'silver'), h1($TITLE); $cur = CGI->new(); # текущий запрос if ($cur->param("message")) { # сообщение получено $cur->param("date",scalar localtime); # установить текущее время @entries = ($cur); # записать сообщение в массив } # открыть файл для чтения и записи с сохранением предыдущего содержимого open (CHANDLE, "+< $CHATNAME") || bail("не могу открыть $CHATNAME: $!"); # получить эксклюзивную блокировку на гостевую книгу # (LOCK_EX == exclusive lock) flock (CHANDLE, LOCK_EX) || bail("не могу получить эксклюзивную блокировку на $CHATNAME: $!"); # занести в $MAXSAVE старые записи, первой самую новую while (!eof(CHANDLE) && @entries < $MAXSAVE) { $entry = CGI->new(\*CHANDLE); push @entries, $entry; } seek(CHANDLE, 0, 0) || bail("не могу перейти на другую позицию в $CHATNAME: $!"); foreach $entry (@entries) { $entry->save(\*CHANDLE); } truncate(CHANDLE, tell(CHANDLE)) || bail("не могу усечь $CHATNAME: $!"); close(CHANDLE) || bail("не могу закрыть $CHATNAME: $!"); print hr, start_form; # проводит горизонтальную линию print p("Имя:", $cur->textfield( -NAME => "name")); print p("Сообщение:", $cur->textfield( -NAME => "message", -OVERRIDE => 1, -SIZE => 50)); print p(submit("отправить"), reset ("очистить")); print end_form, hr; print h2("Предыдущие сообщения"); foreach $entry (@entries) { printf("%s [%s]: %s", $entry->param("date"), $entry->param("name"), $entry->param("message")); print br(); } print end_html;