Анимация
JavaScript


Главная  Библионтека 

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

Подробнее о ссылках вы прочитаете в главе 4 книги Programming Perl и на тап-странице perlref(l).

Более сложные вызывающие последовательности

Мы закончим наш рассказ о компонентах форм созданием одного очень полезного компонента, который позволяет пользователю выбирать любое число элементов этого компонента. Функция scrolling list () модуля CGI.pm может принимать произвольное число пар аргументов, каждая из которых состоит из именованного параметра (начинаюшегося со знака -) и значения этого параметра.

Чтобы ввести в форму прокручиваемый список, нужно сделать следующее:

print scrolling list(

-NAME => "flavors",

-VALUES => [ qw(mint chocolate cherry vanilla peach) ], -LABELS => (

mint => "Mighty Mint",

chocolate => "Cherished Chocolate",

cherry => "Cherry Cherry",

vanilla => "Very Vanilla",

peach => "Perfectly Peachy",

-SIZE =>3,

-MULTIPLE => 1, #1 for true , 0 for false

Значения параметров имеют следующий смысл:

-name

Имя компонента формы. Значение этого параметра можно использовать позже для выборки пользовательских данных из формы с помощью функции param () .

-labels

Ссылка на анонимный хеш. Значения хеша -- это метки (элементы списка), которые видит пользователь формы. Когда пользователь выбирает ту или иную метку, в CGI-программу возвращается соответствующий ключ хеша. Например, если пользователь выбирает элемент, заданный как Perfectly Peachy, CGI-программа получает аргумент peach.

-values

Ссылка на анонимный массив. Этот массив состоит из ключей хеша, на которые ссылается -labels.

-size

Число, определяющее, сколько элементов списка пользователь будет видеть одновременно.



-multiple

Истинное или ложное значение (в том смысле, который принят для этих понятий в Perl), показывающее, можно ли будет пользователю формы выбирать более одного элемента списка.

Если -multiple установлена в значение "истина", вы можете присвоить список, возвращаемый функцией param (), массиву:

@choices = param("flavors");

Вот другой способ создания этого прокручиваемого списка - с передачей ссылки на существующий хещ вместо создания такого хеща "на ходу":

%flavors = (

"mint", "Mighty Mint", "chocolate", "Cherished Chocolate", "cherry", "Cherry Cherry", "vanilla", "Very Vanilla", "peach", "Perfectly Peachy", ) ;

print scrolling list(

-NAME => "flavors", -LABELS => \%flavors, -VALUES => [ l<eys %flavors ], -SIZE => 3,

-MULTIPLE => 1, #1 for true , 0 for false

Ha этот раз мы передаем в функцию значения, вычисленные по ключам хеща % flavors, ссылка на который выполняется с помощью операции \. Обратите внимание: параметр -values здесь тоже взят в квадратные скобки. Простая передача результата операции keys в виде списка не сработает, потому что в соответствии с правилом вызова функции scrolling list () должна быть сделана ссылка на массив, которую как раз и создают квадратные скобки. Считайте квадратные скобки удобным способом представления нескольких значений как одного.

Создание CGI-программы гостевой книги

Если вы внимательно изучили примеры, приведенные выще, то уже должны быть способны заставить работать простые CGI-программы. А как насчет более сложных? Одна из распространенных задач - создание CGI-программы для управления гостевой книгой, чтобы посетители ващего Web-узла могли записывать в нее свои собственные сообщения*.

Как мы отметим ниже, это приложение можно было бы назвать программой Wcbchal (переговоров через Web).



Форма, используемая для создания гостевой книги, довольно проста, она даже проще, чем некоторые из наших форм, посвященных мороженому. Она, правда, имеет некоторые особенности, но не беспокойтесь, по мере продвижения к финишу мы преодолеем все трудности.

Вероятно, вы хотите, чтобы сообщения в гостевой книге сохранялись и по завершении посещения вашего узла тем или иным пользователем, поэтому вам нужен файл, куда они будут записываться. Гостевая CGI-программа (вероятно) работает не под вашим управлением, поэтому у нее, как правило, не будет права на обновление вашего файла. Следовательно, первое, что необходимо сделать, - это создать для нее файл с широкими правами доступа. Если вы работаете в UNIX-системе, то можете сделать (из своего shell) для инициализации файла программы гостевой книги следующее:

touch /usr/tmp/chatflie chmod 0666 /usr/tmp/chatfile

Отлично, HO как обеспечить одновременную работу с программой гостевой книги нескольких пользователей? Операционная система не блокирует попытки одновременного доступа к файлам, поэтому если вы будете недостаточно осторожны, то получите файл, в который записывают сообщения все пользователи одновременно. Чтобы избежать этого, мы используем Perl-функцию flock, позволяющую пользователю получить монопольный доступ к файлу, который мы разрешаем обновить. Это будет выглядеть примерно так:

use Fcntl qw(:flock); # импортирует L0CK EX, L0CK SH, L0CK NB

flock(CHANDLE, L0CK EX) li bail("cannot flock $CHATNAME: $!");

Аргумент LOCK EX функции flock - вот что позволяет нам обеспечить монопольный доступ к файлу*.

Функция flock представляет собой простой, но универсальный механизм блокировки, несмотря на то, что его базовая реализация существенно изменяется от системы к системе. Она не возвращает управление до тех пор, пока файл не будет разблокирован. Отметим, что блокировки файлов носят чисто рекомендательный характер: они работают только тогда, когда все процессы, обращающиеся к файлу, соблюдают эти блокировки одинаково. Если три процесса соблюдают блокировки, а один не соблюдает, то не функционирует ни одна из блокировок.

в версиях Perl до 5.004 вы должны превратить в комментарий use Fcntl и в качестве аргумента функции flock использовать просто 2.



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