CGI-сценарии
Культура Perl допускает различные уровни владения языком. В рассмотренном варианте использован минимальный набор средств. Очевидно, что часть кода, например, декодирование, требуется при обработке не только данной, но и любой другой формы. Естественным шагом в развитии исходного варианта сценария является выделение этой части в отдельную подпрограмму и предоставление доступа к ней другим сценариям. Для этого преобразуем исходный текст в соответствии с планом, изложенным в примере 15.7.
- Часть исходного кода может быть использована другими CGI-программами. Преобразуем ее в отдельный модуль, сохраняемый в файле CGI__UTILS.pm.
package CGI_UTILS; require Exporter; @ISA = qw(Exporter); ^EXPORT = qw(print_header process_input); # Подпрограмма вывода заголовка ответа sub print_header { print "Content-type: text/html\n\n"; }. # Подпрограмма декодирования данных форьы sub process_input { my ($form_ref)=(?_.; my ($ form_data,@pai rs); my ($temp)=""; if ($ENV{'REQUEST_METHOD'} eq 'POST') { read(STDIN,$form_data,$ENV{'CONTENT_LENGTH'}); } else { $form_data=$ENV{'QUERY_STRING'}; } $form_data=~s/%(..)/pack("c",hex($1))/ge; $form_data=~tr/+/ /; $form_data=~s/\n/\0/g; @pairs=split(/&/,$form_data); foreach $item(@pairs) { ($name,$value)=spl£t (/=/,$item); if (!defined($forih_ref › {$name})) < $ form_ref › {Sname}=$value; } else { $form_ref › {$name}.= "\0$value"; } } foreach $item (sort keys %$form_ref) { $temp.=$item."=".$form_ref › {$item}."&";} return($temp); } 1;
- Текст основного сценария обработки формы registrar.cgi преобразуем следующим образом:
#!/usr/bin/perl use cgi_utils; my 8FORM, $file_rec; $file_rec=&process_input(\%FORM); ^Проверка заполнения обязательных полей #if {$FORM{'regname'} eq "" || $FORM{'passwordl'} eq "") { if (!$FORM{'regname'} ||!$FORMTpasswordl'}) { print "Location: /goback.html\n\n"; } #Проверка правильности ввода пароля elsif ($FORM{'passwordl'} eq $FORM{'password2'}}{ print "Location: /confirmation.html\n\n"; open (OUTF, ""users"); print OUTF $file_rec, H \n"; close OUTF } else { &print_header; print"new_form <html> <head><title>Ошибка при вводе пароля</titlex/head> <ЬойухпЗ>Введенные Вами значения пароля не совпадают <br><forro method="get" action="/cgi-bin/registrar.cgi"> <pre> Введите пароль: <input type="password" name="passwordl"> Подтвердите пароль: <input type="password" name="password2"> </pre> new_form / foreach $key (keys %FORM) { if ($key ne "passwordl" && $key ne "password2") { print "<input type=\"hidden\' J name=$key value=$FORM{$key}>\n"; } } print"EndOfHTML <br><br> <input type="submit" value="OK"> <input type="reset" value="Отменить"> </form> </body> </html> EndOfHTML } exit
- В исходном варианте сценария в качестве ответов сервера при получении неполных данных и для подтверждения регистрации пользователя формируются виртуальные HTML-документы. В этом нет необходимости, так как они содержат только статическую информацию. Соответствующие фрагменты сценария преобразуем в HTML-код ротовых документов, которые сохраним в отдельных файлах. В основном сценарии в качестве ответа сервера возвращаются ссылки на эти документы.
Файл confirmation.html содержит документ, посылаемый клиенту в качестве сообщения об успешной регистрации:
<html> <head><title>Пoздpaвляeм!</title></head> <body><h2>Пoздpaвляeм! </h2><br> Ваша регистрация прошла успешно. Вы можете пользоваться нашей библиотекой… – <br> Спасибо за внимание. </body> </html> Файл goback.html содержит документ, посылаемый клиенту при получении неполных данных: <html> <head><title>Heпoлныe данные</^^1ех/пеай> <body><h2>HsBHHMTe, Вы пропустили обязательные данные</h2> <br> <а href=" http://www.klf.ru/welcome.Ылп1 ">Попробуйте еще раз, пожалуйста </а> </body> </htral>