Анимация
JavaScript
|
Главная Библионтека функция eof - встроенная Perl-функция, которая сообщает о достижении конца файла. Многократно передавая в метод new () ссылку на дескриптор сохраняемого файла*, мы выбираем старые записи, по одной при каждом вызове. Затем мы обновляем файл так, чтобы он включал новую запись, которую мы (возможно) только что получили: seek(CHANDLE, О, 0) bailCcannot rewind $CHATNAME: foreach $entry (Sentries) ( $entry->save(\*CHANDLE); # передать дескриптор файла по ссылке truncate (CHANDLE, tell (CHANDLE) ) М bailCcannot truncate $CHATNAME: $i"); close (CHANDLE) I I bailCcannot close $CHATNAME: $i"); Функции seek, truncate и tell - встроенные Perl-функции, описания которых вы найдете в любом справочнике по языку Perl, Здесь seek переставляет указатель позиции в начало файла, truncate усекает указанный файл до заданной длины, а tell возвращает текущее смещение указателя позиции в файле по отнощению к началу файла. Назначение этих строк программы - сохранить в файле только самые последние записи $b4AXSAVE, начиная с той, которая была сделана только что. Метод save () обеспечивает собственно создание записей. Его можно вызвать здесь как $entry->save, поскольку $entry - это CGI-объект, созданный с помощью CGl->new (). Формат записи сохраняемого файла выглядит следующим образом (запись завершается знаком "=", стоящим в отдельной строке): ИМЯ1=ЗНАЧЕНИЕ1 ИМЯ2=ЗНАЧЕНИЕ2 ИМЯЗ=ЗНАЧЕНИЕЗ Теперь пора возвратить обновленную форму броузеру и его пользователю. (Это будет, конечно, первая форма, которую он видит, в том случае, если он щелкнул на ссылке Please sign our guestbook.) Сначала некоторые предварительные действия: print hr, start form; # hr() проводит горизонтальную линию. <hr> Как мы уже упоминали, CGI.pm позволяет нам использовать либо прямые вызовы функций, либо вызовы методов через CGI-объект. В нашей программе для создания базового HTML-кода мы обратились к простым вызовам функций, а для задания полей ввода формы продолжаем пользоваться методами объектов: print pCName:", $cur->textfleld( -NAME => "name")); print p("Message:" $cur->textfleld( Фактически она представляет собой glob-ссылку, а не ссылку на дескриптор файла, но в данном случае это почти то же самое -NAME => "message", -OVERRIDE => 1, # стирает предыдущее сообщение -SIZE => 50)); print p(submit("send"), reset("clear")); print end form, hr; Метод textfieldO возвращает поле ввода текста для нашей формы. Первый из двух приведенных выше вызовов генерирует HTML-код поля ввода текста с HTML-атрибутом, name="name", а второй - создает поле с атрибутом name=" mess age". Компоненты формы, создаваемые модулем CGLpm, по умолчанию устойчивы: они сохраняют свои значения до следующего вызова. (Но лишь в течение одного "сеанса" работы с формой, считая с того момента, когда пользователь щелкнул на ссьике Please sign our guestbook.) Это значит, что поле name="name", созданное в результате первого вызова textfieldO, будет содержать значение имени пользователя, если он уже хотя бы один раз в этом сеансе заполнял и передавал форму. Таким образом, поле ввода, которое мы сейчас создаем, будет иметь следующие HTML-атрибуты: NAME="name" VALUE="Sara Smith" Совсем другое дело - второй вызов textf ield (). Мы не хотим, чтобы поле сообщения содержало значение старого сообщения. Поэтому пара аргументов -override => 1 указывает: "Выбросить предьщущее значение этого текстового поля и восстановить значение по умолчанию". Пара аргументов-size => 50 задает размер (в символах) отображаемого поля ввода. Помимо показанных здесь, могут быть и другие необязательные пары аргументов: -default => начальное значение и -bdAXLENGTH => п, где п - максимальное число символов, которое может принять данное поле. Наконец, к удовольствию пользователя, мы выводим текущий перечень сохраняемых сообщений, включающий, естественно, то, которое он только что передал: print h2("Prior Messages"); foreach $entry (gentries) ( printf("%s [%s]: %s", $entry->param("date"), $entry->param("name"), $entry->param("message")); print br (); print end html; Как вы, без сомнения, догадываетесь, функция h2 задает HTML-заголовок второго уровня. В остальной части кода мы просто последовательно формируем текущий список сохраняемых записей (это тот же список, который мы ранее записали в сохраняемый файл), выводя из каждой дату, имя и сообщение. Пользователи могут работать с этой формой гостевой книги, непрерывно набирая сообщения и нажимая кнопку передачи. Это имитирует электронную доску объявлений, позволяя пользователям видеть новые сообщения друг друга сразу же после их передачи. Общаясь друг с другом подобным образом, пользователи многократно вызывают одну и ту же CGI-программу; предыдущие значения компонентов формы автоматически сохраняются до следующего вызова. Это особенно удобно при создании многоступенчатых форм - например, тех, которые используются в так называемых приложениях "тележек для покупок", когда вы, перемещаясь по виртуальному магазину, последовательно "делаете покупки" и форма все их запоминает. Поиск и устранение ошибок в CGI-программах CGI-программы, запускаемые с Web-сервера, функционируют в соверщенно иной среде, нежели та, в которой они работают при вызове из командной строки. Конечно, вы всегда должны добиваться, чтобы ваща CGI-программа нормально работала при вызове ее из командной строки*, но это не гарантирует нормальную работу программы при вызове с Web-сервера. Помогут вам разобраться в этом сборник часто задаваемых вопросов по CGI и хорошая книга по CGI-программированию. Некоторые из источников перечислены в конце главы. Вот краткий перечень проблем, часто встречающихся в CGI-программировании. При возникновении почти каждой из них выдается раздражающе-бесполезное сообщение 500 Server Error, С которым ВЫ вскоре познакомитесь и которое возненавидите. • Если, посылая HTML-код в броузер, вы забыли о пустой строке между HTTP-заголовком (т.е. строкой Content-type) и телом, этот HTML-код работать не будет. Помните, что перед тем, как делать все остальное, нужно ввести соответствующую строку Content-Type (и, возможно, другие HTTP-заголовки) и соверщенно пустую строку. • Серверу необходим доступ к сценарию с правом чтения и выполнения, поэтому он, как правило, должен иметь режим 0555, а лучше 0755. (Это характерно для UNIX.) • Каталог, в котором находится сценарий, сам должен быть выполняемым, поэтому присвойте ему режим доступа 0111, а лучше 0755. (Это характерно для UNIX.) • Сценарий должен быть инсталлирован в соответствующем конфигурации вашего сервера каталоге. В некоторых системах, например, это может быть /usr/etc/httpd/cgi-bin. Советы по отладке в режиме командной строки приведены в документации на CGI.pm. 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 |