![]() |
![]() |
|
||
![]() |
|
||||||||||||||||||||||||||||||||||||||||||
| [5 сентября 2001 г.] |
|
Распространенное заблуждение |
Итак, мы худо-бедно (а может быть, все-таки толсто-богато, судя по ценности предыдущего материала?..) разобрались с тем, как избавиться от надоедливой 500-й ошибки при работе на Perl, а также о модуле CGI::WebOut, призванным сделать жизнь раем. Если помните, впереди еще две задачи, одна из которых сейчас успешно разрешится.
Прежде, чем читать дальше, пристегните ремни безопасности. Установка модуля CGI::WebIn, который описывается далее, сопряжена с риском. Риском полностью отказаться от PHP в своей работе и перейти на Perl. Я не шучу. На первых порах, если у вас нет наработок на Perl, это может действительно отрицательно сказаться на производительности труда.
|
Чтобы иметь хоть какой-то эталон, давайте посмотрим, что сделает PHP, если скрипту передадутся данные следующей формы:
<form action=script.php method=POST enctype=multipart/form-data> <input type=text name=F1 value="1"> <input type=text name=F2[elt] value="2"> <input type=text name=F3[elt][subelt] value="3"> <input type=text name=F4[] value="4"> <input type=text name=F4[] value="5"> <input type=file name=F5> </form>
Воспользуемся самой новой версией PHP и посмотрим, какие глобальные переменные она создаст. Получим примерно следующее:
$F1 === 1 $F2 === array(elt => 2) $F3 === array(elt => array(subelt=>3)) $F4 === array(4,5) $F5 === временное имя закачанного файла
Откуда взялся тройной знак равенства? Но ведь именно он обозначает в PHP оператор проверки на идентичность... |
Что ж, мы видим, что PHP оказывается довольно услужливым, когда дело доходит до разбора данных формы. Ему даже все равно, каким
Теперь можно установить модуль CGI::WebIn и посмотреть, что он нам предоставляет. Вы можете, как обычно, скачать его из архива по адресу http://www.dklab.ru/chicken/mod/ppd (для Windows) или http://www.dklab.ru/chicken/mod/cpan (для Unix).
Если вы в недоумении и не знаете, как устанавливать модули в различных операционных системах, читайте об этом в пятой набле. |
Модуль CGI::WebIn делает то же самое, что и PHP в приведенном выше примере. А именно, все переменные, пришедшие из формы, а также Cookies, он преобразует (по желанию) в переменные вызвавшего пакета. Итак, имея форму:
<form action=script.pl method=POST enctype=multipart/form-data>
<input type=text name=F1 value="1">
<input type=text name=F2{elt} value="2">
<input type=text name=F3{elt}{subelt} value="3">
<input type=text name=F4{} value="4">
<input type=text name=F4{} value="5">
<input type=file name=F5>
</form>
и написав в скрипте:
#!/usr/bin/perl -w use CGI::WebIn(1);мы получим переменные:
$main::F1 == 1
%main::F2 == (elt => 2)
%main::F3 == (elt => {subelt=>3})
%main::F4 == (4=>4, 5=>5) # Внимание!
$main::F5 == (file=>врем_имя, filename=>исх_имя, ...)
Здесь есть три торжественных момента.
Зачем мы написали 1 в скобках в предложении
В PHP, как известно, нет никаких пакетов и модулей, и все переменные бывают либо глобальными, либо локальными внутри функции. Что может быть неудобнее?.. Разве что отсутствие переменных вообще. С Perl ситуация совершенно иная, и термин «экспортирование» означает следующее. Когда мы создаем некоторый объект в |
Каким еще может быть значение в скобках при подключении модуля CGI::WebIn? Например, строка-комбинация из букв "g", "p", "c" и "e". Первая буква означает, что будут экспортироваться поля, пришедшие методом GET,
И, наконец, строчка, помеченная комментарием «Внимание!». Заметьте: в отличие от PHP, где пустые квадратные скобки в имени поля означают «создать очередной элемент массива», модуль CGI::WebIn воспринимает конструкцию
<select name=List{} multiple>
<option value=1>Один
<option value=2>Два
<option value=3>Три
</select>
Если пользователь выберет элементы 1 и 3, то в программе создастся хэш #!/usr/bin/perl -w
use CGI::WebOut;
use CGI::WebIn(1);
if(exists $List{1}) { print "Выбрана цифра 1!" }
Вам не кажется, что уже настало время привести пример использования модуля CGI::WebIn в связке с CGI::WebOut? Что?.. Тогда приступим.
Я, правда, не могу знать наверняка, что вы ответили только что. Так что всех, кому первая попытка не удалась, а также заядлых приверженцев PHP, не желающих «читать эту ересь», прошу срочно закрыть глаза или нажать на кнопку справа от монитора. Знаете, такая большая, с лампочкой над ней...
|
#!/usr/bin/perl -w
use CGI::WebOut;
use CGI::WebIn(1);
# Зачем эти глупые строчки? Только для того,
# чтобы обмануть Perl. Если их не написать,
# скрипт будет весьма надоедливо сообщать о том, что
# описанные ниже переменные используются лишь
# один раз и "это, возможно, тупо" (possible typo).
our ($doGo,%Address,$Count);
# Считаем, сколько раз этот пользователь
# запустил скрипт (десятилетний Cookie).
SetCookie("Count",++$Count,"+10y");
# Кнопка нажата?.. Если да, то в переменной $doGo
# (см. ниже) будет строка "Say hello".
if($doGo) {
print "Hello from $Address{Russia}{Moscow}!";
}
# Теперь, скрепя сердце, печатаем форму, как это
# делали еще наши деды. Такой код во множестве
# сердец вызывает заслуженное отвращение, но что
# поделать - пока что у нас нет выбора.
print <<EOT;
You have visited this page $Count times.
<form action=$SCRIPT_NAME method=post enctype=multipart/form-data>
<input type=text name="Address{Russia}{Moscow}" value="house">
<input type=submit name=doGo value="Say hello">
</form>
EOT
Ну что же, это уже почти PHP. Для полного расслабления нам не хватает лишь возможности вставлять код скрипта прямо в
![]() |
| ||||||||||||||||||||||||
| Дмитрий Котеров | 5 сентября 2001 г. ©1999-2010 | | Контакт | Вернуться к оглавлению |