Анимация
JavaScript


Главная  Библионтека 

0 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 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 [ 79 ] 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103

$entry, # одна конкретная запись

$TITLE = "Simple Guestbook";

$CHATNAME = "/usr/tmp/chatflie"; # где все это в системе находится $MAXSAVE = 10;

print header, start html($TITLE), hl($TITLE);

$cur = CGI->new(); # текущий запрос

if ($cur->param("message")) { # хорошо, мы получили сообщение

$cur->param("date", scalar localtime); # установить текущее время (gentries = ($cur); # записать сообщение в массив

# открыть файл для чтения и записи (с сохранением предыдущего содержимого) open(CHANDLE, "+< $CHATNAME") bail("cannot open $CHATNAME: $");

# получить эксклюзивную блокировку на гостевую книгу

# (LOCK EX == exclusive lock)

flock(CHANDLE, LOCK EX) I I bail("cannot flock $CHATNAME: $");

# занести в $MAXSAVE старые записи (первой - самую новую) while С eof (CHANDLE) SS (Jentries < $MAXSAVE) {

$entry = CGI->new (\*CHANDLE); # передать дескриптор файла по ссылке push (gentries, $entry;

seek(CHANDLE, 0, 0) M bail("cannot rewind $CHATNAME: $i"); foreach $entry ((entries) (

$entry->save(\*CHANDLE); # передать дескриптор файла по ссылке

truncate(CHANDLE, tell(CHANDLE)) bail("cannot truncate $CHATNAME: $"); close(CHANDLE) bail ("cannot close $CHATNAME: $");

print hr, start form; # hr()проводит горизонтальную линию: <HR>

print p("Name:", $cur->textfield(

-NAME => "name")); print p("Message:" $cur->textfield{

-NAME => "message",

-OVERRIDE => 1, # стирает предыдущее сообщение

-SIZE => 50)); print p(submit("send"), reset("clear")) ; print end forra, hr;

print h2("Prior Messages"); foreach $entry ((entries) (

printf("%s [%s]: %s",

$entry->param("date"),

$entry->param("name"),

$entry->param("message"));

print br 0;

print end html;



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

Netscape - [Simple Gueslboot [

£ile £d,t Go look

Tiaiks Qpl

ons Qrrec

low Help

Edii-

Find

Go lo hKp www pefl com/cgi-bifi/guesfbook

Simple Guestbook

Name:

Message:

send

clear:

Prior Messages

Tue Nov 18 17:25 ;50 1997 [Princess Leia Organa]; Help me Obi Wan, youre my only hope.

.Document: Done [ £3

Puc. 19.5. Форма простой гостевой книги

Обратите внимание на то, что программа начинается с оператора

use 5.004;

Если вы хотите запускать ее с помощью более ранние версии Perl 5, то нужно превратить в комментарий строку

use Fcntl qw(:flock)

и заменить lock ex в первом вызове flock на z.

Поскольку каждое выполнение программы приводит к возврату HTML-формы в броузер, который обратился к программе, то программа начинается с задания HTML-кода:

print lieader, start html ($TITLE) , hl($TITLE);



Затем создается новый CGI-объект:

$cur = CGI->new(); # текущий запрос

if ($cur->param("message")) { # хорошо, мы получили сообщение

$cur->param("date", scalar localtime); # установить текущее время

(gentries = ($cur); # записать сообщение в массив

Если нас вызывают посредством заполнения и передачи формы, то объект $cur должен содержать информацию о тексте, введенном в форму. Форма, которую мы предлагаем (см. ниже), содержит два поля ввода: поле имени для ввода имени пользователя и поле сообщения для ввода сообщения. Кроме того, приведенный выше код ставит на введенные в форму данные (после их получения) метку даты. Передача в метод param () двух аргументов - это способ присваивания параметру, заданному первым аргументом, значения, указанного во втором аргументе.

Если нас вызывают не посредством передачи формы, а выполняя щелчок мышью на ссылке Please sign our guestbook, то объект запроса, который мы создаем, будет пуст. Проверка if даст значение "ложь", и в массив @entries никакой элемент занесен не будет.

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

open(CHANDLE, "+< $CHATNAME") М bail("cannot open $CHATNAME. $");

Эта функция открывает файл в режиме неразрушающего чтения-записи. Вместо open можно использовать sysopen (). При таком способе посредством единственного вызова открывается старый файл, если он существует (без уничтожения его содержимого), а в противном случае создается новый файл:

# нужно импортировать две "константы" из модуля Fcntl для sysopen use Fcntl qw( 0 RDWR 0 CREAT );

sysopen(CHANDLE, $CHATFILE, 0 RDWR0 CREAT, 0666) II bail "cant open $CHATFILE: $";

Затем мы блокируем файл, как описывалось выше, и переходим к считыванию текущих записей из $ мах save в (aentnes:

flocl< (CHANDLE, L0CK EX) ball ("cannot flocl< $CHATNAME: $"); while ( I eof (CHANDLE) SS (Jentries < $MAXSAVE) (

$entry = CGI->new(\*CHANDLE); # передать дескриптор файла по ссылке

push (Sentries, $entry;



0 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 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 [ 79 ] 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103