Анимация
JavaScript
|
Главная Библионтека 29: 30: 31: 32: 33: 34: 11 die "Сш/Ёка трл апыпяя $1азЬ Ш.е: $1-eanswers=<QF>; close(QF); dmp eanswersf t Vpnmb омвспл нжй стрске return(answers); Проведем анализ программы. • Строка 6. В переменной $survey dir задается имя каталога, где должны находиться файлы опроса. Чтобы создать новый опрос, вы можете просто поместить текстовый файл с расширением .txt в этот каталог, как бьшо они-сано в начале данного раздела. Этот каталог должен быть доступным для записи процессам Web-сервера Доступность для записи обычно означает наличие у пользователя прав доступа 0755 в системе UNIX или разрешение на запись в данный каталог для учетной записи guest в системе Windows NT. • Строка 8. Функции findjast file{) в качестве параметра передается расширение файла (либо ,txtr либо .answer). Она находит в каталоге Ssiirvey dir последний по алфавиту файл заданного типа. Эта функция общего назначения вноследствии иснользуется функцией get file contents(), а также программой записи результатов опроса, которую мы рассмотрим в следующем разделе. Если в данном каталоге нет файлов такого типа, то функция find last file() возвращает значение.undef. • Строка 20. Функции get file contents(} в качестве параметра также передается расширение файла (опять-таки .txt либо .answer). Она возвращает содержимое последнего файла указанного типа из каталога опроса. Чтобы найти имя этого файла, она вызывает функцию find last file(). Оставшаяся часть программы, приведенная в листинге 24.5, достаточно проста. Листинг 24.5. ражение опроса, часть 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: ♦ получить содержимое последнего текстового айпа с анкетш my(Squestion, Sanswers)=get file contents{"txt"); print header; print qq{<rORM ACTION="/cgi/writesurvey.cgi" KETH0D=POST>\n}; print "Вопрос: $question<P>\"; Щ $answerO; foreachf§asswers) { print "<INPirT TYPE=RADIO NAME=answer value=Sanswer>"; print •$ <BR>\n"; $answer+ + ; print qq{<INPDT TYPE=SUBMIT VALUE="3anpoc>>; jjxiQj qq{</FORM>}; . ОСНОВНОЙ КОД программы начинается со строки 36. Содержимое последнего .txt-файла загружается в переменную для первой строки и в - для ос- тальной части файла функцией get file contents!). 24-й ча Сосда аного Web-сервера В строке 40 вы должны изменить путь /cgi/writesurvey.cgi к CGI-программе записи данных опроса. Далее выводится заголовок анкеты и ее вопросы посылаются броузеру. Каждая строка в массиве answers оформляется в виде переключателя. Первой по порядку кнопке переключателя присваивается 0, второй - 1 и т.д. до тех пор, пока в массиве §answers не останется ни одного варианта ответа. Тело анкеты будет выглядеть примерно так: <INPUT TypE=RADIO NAME=answer value=0>Co6aKa<BR> <INPUT TYPE=RADIO NAHE=answer valiie=l>KoinKa<BR> <Шт TYPE=SADIO SWlE=answer valxie=2>PH6xH<BR> HAME=answer value=3> СНи меня раздраха1от<ВЕ> После того как пользователь выберет вариант ответа и щелкнет на кнопке подачи запроса, CGI-программе будет передан параметр answer, содержащий номер ответа. CGI-программа /cgi/writesurvey.cgi, обрабатывающая данные формы (полный путь к ней задается в строке 40), запишет ответы в файл. Эта программа рассматривается в следующем разделе. Часть II: анализ результатов После того как пользователь щелкнет на кнопке подачи запроса (Submit), начинается настоящая работа. Ответ пользователя (т.е. выбранный им вариант) необходимо записать в файл, а результаты - свести в таблииу, а затем отобразить. Программа, листинг которой приведен ниже, кажется довольно длинной, но; на самом деле большую ее часть составляют подпрограммы, с которыми вы уже встречались. Подпрограммы блокирования файлов get lock() и release lock( >, которые использовались на протяжении всей книги, и подпрограммы get file contents() и findJastfileO из программы отображения опроса также вносят существенный вклад в увеличение размера данной CGI-программы, Начало кода программы обработки опроса приведено в листинге 24.6. Повторяю еще раз: пусть ее размер вас не пугает, так как большая часть этой программы вам уже знакома. Листинг 24.6. Обработка опроса, часть I 1 bin/perl -w 3: use. strict; 4: use Fcntl qw(:flock); 5: use QGI qw(:all); 7: my{Ssurvey dir, $lockfile); 8: $survey dir=*yweb/htdocs/poll"; 9: 51ockfile="/tmp/surveylock"; 11: sub finl lastjile { my($type)=§ ; my(efilee, $last file); 13: ..... 14: I ОпыЕь каталог, взшь гссщгрий фдйп 15: t н/жюго тит. 16: opendir(SD, $survey dir) [ die "Qii£Ka rp стщыгии SsuTvey dir: $1"; 17: efiles=reverse sort grep(/\.$typef/, rraddir SD); 18: closedir{SD); 19:1 $last file=Sfiles[$files]; 20:i return{$last file); £i±) get ile CEntei { iiy(Stype)*g f my(eanswers, $last file); $last file=find last file($type); 21:i 22:; 23:: 24:; 25: 26: 27:; 28:; 29:1 return if cMdred $last file); I (>ibiib аш и гртхсвть егс) ас{[»<июе open(QF, "$survey dir/$last file") 11 die "ОиВахрячгаия $last file: $!"; #answers=<QF>; close(QF); rs; I удалить сиувспы iebcm стрски return{? answers); siibget lock{ cpai/SEM, >$lockfile") I die "01»йа15исщ1рЕзияаауС5а:$Г; 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: flOCik(SEM, LOCK EX) 11 die "Qiiaipi&rratiCBaEMiфайла: $J 42: } 43: siib release lock { 44: close (SEM); 45: > Пока все в листинге 24.6 должно быть вам понятно и знакомо. Используемые здесь подпрограммы либо взяты из предыдущей программы, как, например, get file contents() и find last file(), либо это подпрограммы get lock() и release lock(). И опять-таки проверьте, Что Web-сервер может осуществлять запись в каталог, имя которого указанно в переменной Ssurveydir). И поскольку здесь все просто, давайте перейдем к продолжению программы, приведенному в листинге 24.7. Ли 24.7. ЯЯВЙШ1ЯЯЯИ111НН11И ту{$qaestion, eposs answers)=get file contents("txt"); 46: 47: 48: 49: 50: i ДобаЕкпъ данные в файл ответов 51: if (defined param("answer")) { 52: my($lastfile); 53: get lock(); 54: t ваши имя последнего файла ощхэса и создать 55: t на его остове икя файла ответов. 56: $lastfile=find last file("txt"); 57: $lastfile="s/txt/anEwer/; 58: 59: 60: open(ANS, • »Ssur¥ey dir/ Slastfile") jj die "01 при открии $lastfile: $! 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 104 105 106 107 108 109 110 111 112 113 114 115 [ 116 ] 117 118 119 120 121 122 |