
Наиболее частым примером для программирования является Гостевая книга.
В данной статье мы напишем простую Гостевую книгу, записывающую данные в файл.
Для начала расскажу об самом скрипте, будет реализован он в виде одного файла.
Принцип работы. При запуске скрипта будет выводиться список сообщений, а в конце будет форма для записи нового сообщения. Скрипт будет проверять наличие параметров запроса, если скрипт получает данные из формы, он их записывает в файл и производит редирект, на список сообщений.
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 |
#!/usr/bin/perl use strict; # Директива для ужесточения стилистического контроля use CGI; # подключаем модуль CGI my $gb_path="gb.dat"; #Файл, где будут храниться записи my $query=new CGI; # создаем объект CGI #Если запрос нулевой то выводим список сообщений if(!$query->param){ #Заголовок print $query->header,$query->start_html('Записи в гостевой книге'); #Открываем файл open(GB_DAT,"$gb_path")|| die("Невозможно открыть файл - $gb_path"); my @lst=<GB_DAT>; # Помещаем строки в массив #Выводим данные for(my $i=@lst-1;$i>=0;$i-=3){ # пробегаемся по всем строкам # выводим имя автора как ссылку на его e-mail print "<hr>Автор: <a href=mailto:$lst[$i-1]>$lst[$i-2]</a><br>"; # выводим сообщение print "Сообщение:<br>$lst[$i]<br>"; } #Закрываем файл close(GB_DAT); #Вывод формы записи сообщения print <<HTML; <form action=gb.cgi method=post> <input type=hidden name=action value=add> Ваше имя: <input type=text name=aname><br> E-mail:<input type=text name=email><br> Сообщение:<textarea name=mess></textarea><br> <input type=submit value=Записать><input type=reset value=Очистить> </form> HTML print $query->end_html; # конец html-документа }else{ #Обработка данных из формы #Открываем файл для дописи open(GB_DAT,">>$gb_path")|| die("Невозможно открыть файл - $gb_path"); # Блокируем файл для записи другими пользователями flock(GB_DAT,2)|| die("Невозможно заблокировать файл - $gb_path"); #записываем данные print GB_DAT $query->param('aname')," ";# Имя записавшего print GB_DAT $query->param('email')," "; # E-mail my $message=$query->param('mess'); # считываем сообщение $message=~tr/ / /; #Заменяем возвраты каретки на пробелы print GB_DAT "$message "; # Записываем сообщение в файл #Закрываем файл close(GB_DAT); #Перенаправляем пользователя на список print $query->redirect('gb.cgi'); } |
Введённые данные записываются в файл указанный в переменной $gb_path. Для работы скрипта необходимо создать файл указываемый в gb_path и установить ему права на запись (для Unix).
Зачем нужна блокировка файла при записи?
Функция flock блокирует файл для доступа другими пользователями, дабы не произошло неразберихи при записи, если, допустим, к данному скрипту одновременно обратились несколько пользователей и один начал запись сообщения, когда как другой пользователь в это время тоже записывает сообщение, может возникнуть ситуация когда их записи перепутаются, какой будет результат, думаю, вы поняли. Для этого и блокируется файл.
Замечания по работе скрипта…
- Скрипт носит демонстрационный характер и содержит минимум форматирования.
- Цель написания данного скрипта заключается в демонстрации обработки форм и записи результатов в файл.
- Данный скрипт проверен на Apache под операционными системами Win2000 и FreeBSD.
.