Списки
Списки в HTML бывают трех типов: ненумерованные, нумерованные и
так называемые списки терминов. Ненумерованный список оформляется с помощью блока
<UL>
<LI> элемент
<LI> элемент
...
</UL>
Список будет отображен примерно так:
Элемент 1 Элемент 2 ....
Нумерованный список отличается от ненумерованного тем, что около
пунктов вместо жирных точек вставляются порядковые номера пунктов.
Оформляется он в виде блока
<OL>
<LI> элемент
<LI> элемент
...
</OL>
Отобразится он в таком виде:
- Элемент 1 Элемент 2 ....
Третим видом списка является список терминов. Он очень удобен для
оформления всевозможных глоссариев. Оформить такой список можно с помощью блока
<DL>
<DT>Термин1 <DD>Описание1
<DT>Термин2 <DD>Описание2
...
</DL>
Вид у полученного списка будет примерно следующий:
Термин1
Описание1
Термин2
Описание2
...
SQL - сервер фирмы Oracle
При реализации сценария 3 встает вопрос о выборе качественной
платформы для создания информационного хранилища. Реляционная система управления базами данных фирмы Oracle
является лидером на рынке СУБД. По производительности, надежности
хранения данных, развитию семейства интерфейсов, объему серверных платформ продукты
Oracle возглавляют многочисленные рейтинги. Гибкость использования, развитые средства управления доступом и распределенная
архитектура делают сервер Oracle чрезвычайно привлекательным для технологии информационных хранилищ,
а возможность работы на свободно - распространяемых Unix-платформах расширяет его возможности в некоммерческой среде.
Существенным ограничением использование Oracle в сфере науки и образования является достаточно высокая
цена и низкое бюджетное финансирование. Однако с 1996 года фирма Oracle
объявила о специальной программе для российских университетов, что позволяет за относительно небольшие деньги приобрести
любой набор продуктов Oracle.
Стандартный входной поток
В случае метода запроса POST данные передаются как содержимое HTTP запроса. И будут посланы в стандартный входной поток.
Данные передаются cgi-модулю в следующей форме:
name=value&name1=value1&...&nameN=valueN
где name - имя переменной,
value - значение переменной,
N - количество переменных
На файловый дескриптор стандартного потока ввода посылается CONTENT_LENGTH байт. Так же сервер передает cgi-модулю CONTENT_TYPE (тип данных). Сервер не посылает символ конца файла после передачи CONTENT_LENGTH байт данных или после того, как cgi-модуль их прочитает. Переменные окружения CONTENT_LENGTH и CONTENT_TYPE устанавливаются в тот момент, когда сервер выполняет cgi-модуль. Таким образом, если в результате исполнения формы с аргументом тега FORM - METHOD="POST" сформирована строка данных firm=МММ&price=100023, то сервер установит значение CONTENT_LENGTH равным 21 и CONTENT_TYPE в application/x-www-form-urlencoded, а в стандартный поток ввода посылается блок данных.
В случае метода GET, строка данных передается как часть URL.
Т.е. например
http://host/cgi-bin/script?name1=value1&name2=value2
В этом случае переменная окружения QUERY_STRING принимает значение
name1=value1&name2=value2
Стандартный вывод
СGI - модуль выводит
информацию в стандартный выходной поток. Этот вывод может представлять
собой или документ, сгенерированный cgi-модулем, или инструкцию серверу, где получить необходимый документ. Обычно cgi-модуль
производит свой вывод. Преимущество такого подхода в том, что
cgi-модуль не должен формировать полный HTTP заголовок
на каждый запрос.
Заголовок выходного потока
В некоторых случаях необходимо избегать обработки сервером вывода cgi-модуля, и посылать клиенту данные без изменений. Для отличия таких cgi-модулей, CGI требует, чтобы их имена начинались на nph-. В этом случае
формирование синтаксически правильного ответа клиенту cgi-модуль берет на себя.
Заголовки с синтаксическим разбором
Вывод cgi-модуля должен начинаться
с заголовка содержащего определенные строки и завершаться двумя
символами CR(0x10).
Любые строки не являющиеся директивами сервера, посылаются непосредственно
клиенту. На данный момент, CGI спецификация определяет три директивы
сервера:
Content-type
MIME или тип возвращаемого документа
Например:
Content-type: text/html <CR><CR>
сообщает серверу, что следующие за этим сообщением данные - есть документ в формате HTML
Location
указывает серверу, что возвращается не сам документ, а ссылка на него
Если аргументом является URL, то сервер передаст указание клиенту
на перенаправление запроса. Если аргумент представляет собой виртуальный
путь, сервер вернет клиенту заданный этим путем документ, как
если бы клиент запрашивал этот документ непосредственно.
Например: Location:
http://host/file.txt приведет к тому, что WWW сервер выдаст file.txt, как если бы он был затребован клиентом. Если cgi-модуль возвращает ссылки на gopher сервер, например на gopher://gopher.ncsa.uiuc.edu/. Вывод будет следующий:
Location: gopher://gopher.ncsa.uiuc.edu/
*Status
задает серверу HTTP/1.0 строку-статус, которая будет послана клиенту в формате: nnn xxxxx
где: nnn - 3-х цифровой код статуса
ххххх - строка причины
Например: HTTP/1.0 200 OK
Server: NCSA/1.0a6
Content-type: text/plain
<динамически генерируемый текст сообщения>
В данном случае, клиенту будет сообщено об успешном выполнении запроса.
Структура HTML-документов
Web-страницы описываются на специальном языке, называемом HTML (HyperText
Markup Language, Язык разметки гипертекстовой информации), который позволяет
осуществлять простое форматирование текста, вставку графики, а также
составление таблиц и цветовое оформление документов.
Будучи подмножеством языка SGML, HTML имеет теговую структуру. Это означает, что в тексте встречаются комманды, изменяющие интерпретацию
информации. Например, слово, напечатанное курсивом, в исходном
тексте выглядит так:
слово, напечатанное <I>курсивом</I>.
Теги записываются в угловых скобках и могут содержать дополнительные
параметры. Большинство тегов располагается в виде ``скобок'' вокруг текста (как теги
<I> и </I> вокруг слова ``курсивом'' в приведенном выше примере).
Благодаря этому свойству, теги можно подразделить на открывающие и
закрывающие. Не у всех тегов существуют соответствующие им закрывающие,
такие теги иногда называют ``пустыми''(empty). Общую структуру открывающего тега можно записать так:
<NNNNN Name="Value" .....>
Соответствующий закрывающий тег быдет иметь вид
</NNNNN>
Далее под словом ``тег'' мы будем понимать совокупность открывающего
и соответствующего ему закрывающего (если таковой существует) элементов.
Таблицы символов
Таблицы символов пакета хранятся в ассоциативном массиве с тем же именем и
двойным двоеточием в конце. Для пакетов включенных в пакет имя символьной
таблицы составляется аналогичным образом: %OUTER::INNER::.
Теги HTML
Рассказ о тегах языка HTML поведем на примере создания некоторой
Web-страницы. Пусть перед нами стоит задача сделать страницу, посвященную
некоторой личности (например, самому читателю), тогда такая Web-страница
будет называться ``домашней'' (homepage). Сейчас будут рассмотрены
теги языка, а применение их на странице будет оставлено Читателю
в качестве упражнения.
Текст
Хотя текстовые файлы и занимают меньше всего места по сравнению
с изображениями или звуком, определенную экономию можно извлечь
и из них. Прежде всего -- комментарии в HTML-коде. Вы действительно
уверены что все они необходимы? И уверены ли вы, что все то, что
вставил в создаваемый документ ваш любимый редактор HTML, действительно нужно?
Иногда оказывается, что нет. В таких случаях лишнее лучше убрать.
Кроме того, лишнее присутствует даже во всех без исключения простых текстовых
файлах формата DOS или Windows. Это лишнее содержится в конце каждой строки.
Дело в том, что в системах семейства UNIX для указания перевода строки
используется один символ, тогда как в системах DOS и Windows -- целых два.
То есть, файл занимает на столько больше байт, чем может, сколько строк
в нем содержится. Если ваш WWW сервер работает под управлением одной из
разновидностей UNIX, попробуйте убрать лишнее из HTML файлов. Обычно это
делается с помощью утилит типа fromdos, dos2unix, dtox,
или им подобных (это зависит от типа используемой операционной системы).
Спросите у вашего системного администратора. Он должен знать. Если он не знает,
скажите об этом его начальнику. В любом случае, ВАМ это полезно знать, и вы
имеете на это право!
Термы и операторы списка
Операторы в Perl-е имеют различный приоритет. Операторы, заимствованные из C,
сохранили между собой ту же иерархию, что и в C. Термы имеют самый большой
приоритет, они содержат переменные, кавычки, выражения в скобках,
функции с их
параметрами. Если за списковым оператором ( например, print()) или унарным
оператором ( например, chdir()) следует список аргументов, заключенный в
скобки, то эта последовательность имеет самый высокий приоритет, подобно
функции с аргументами. Аналогично термам обрабатываются последовательности
do{} и eval{}.
Тестирование страниц
К сожалению, образ мышления пользователей, общающихся с компьютерами
от случая к случаю, сильно отличается от образа мышления профессиональных
дизайнеров Web-страниц и программистов. По этой причине, зачастую, готовые
и, вроде бы внешне очень привлекательные страницы не отвечают своему
предназначению - доносить до пользователей информацию.
В связи с этим имеет смысл рассматривать Web-страницы как пользовательские
интерфейсы к данным, которые разработчики хотят донести до конечных
пользователей. А у хороших пользовательских интерфейсов есть очень
важные особенности: они ИНТУИТИВНО ПОНЯТНЫ и УДОБНЫ.
Под интуитивной понятностью можно в данном контексте понимать очевидность для
пользователя координат той информации, которую он хотел бы получить. Например,
если дизайнер разместил на картрированном изображения область
(картрированное изображение), за которой
скрывается какая-либо важная информация, но не выделил ее на изображении каким-либо
очевидным для пользователя образом (скажем, не оформил ее в виде очень
привлекательной для нажатия кнопки), можете быть уверены: никто до этой информации
не доберется.
Под удобством понимается количество трудозатрат пользователя по получению
какой-либо информации.
Именно для достижения максимального удобства пользователей следует
обращать большое внимание на тестирование
страниц перед их размещением в общедоступных местах.
Интересна методика разработки
и тестирования Web-страниц, применяемая в компании Sun Microsystems.
При создании больших WWW-документов очень важно распределить всю информацию
между ветками иерархии страниц. К этому имеет смысл привлечь пользователей.
В лаборатории Sun Microsystems, занимающейся разработкой Web-страниц,
пользователям предлагается набор бумажных карточек с названиями материалов.
Эти карточки пользователи раскладывают группами на столе в соответствии со
своими представлениями. Понимая, что пользователям кажется идейно близким
по содержанию, дизайнеры создают более удачные страницы.
После создания первых вариантов оформления страницы распечатываются на бумаге
и демонстрируются пользователям. Предлагается угадать, что стоит за ссылками и
рассказать общие впечатления от дизайна страниц. Если пользователям что-то
не нравится, страницы приходится переделывать.
Последняя стадия тестирования заключается в демонстрации пользователям
рабочего варианта страниц ``в рабочем виде''. Пользователь садится
за компьютер с запущенным браузером и начинает ``путешествовать'' по новым
страницам. Даются несколько заданий по поиску конкретной информации, а также
наблюдается, на что пользователь больше всего обращает внимание.
Требования к ресурсам
Программное обеспечение сервера NCSA представляет собой прикладное программное обеспечение,
предназначенное для работы под ОС Unix.
В зависимости от аппаратной платформы
требуемый размер оперативной памяти и дискового пространства
существенно изменяются. Для
семейства "Unix для PC"
(Solaris, SCO, UnixWare, Linux, BSD, BSDI), необходимо
ориентироваться на 2 Mb оперативной
памяти. Дисковое пространство,
требуемое при установке, составляет
около 2Mb, однако при планировании
установки нужно учитывать,
что при интенсивном доступе к серверу
статистика доступа будет составлять до нескольких сот килобайт
в день и нескольких десятков мегабайт в месяц.
Управление доступом
Сервер NCSA содержит гибкие средства управления доступом. С их
помощью можно централизованно или децентрализованно управлять
доступом, основываясь на структуре адреса WWW - клиента, создавать
пары имя/пароль для документов или целых подразделов, создавать
несколько пар имя/пароль.
Управление доступом с использованием пар имя/пароль
Для введения ограничений на доступ ко всем документам определенного
каталога необходимо создать в этом каталоге файл управления доступом.
Этот файл имеет фиксированное имя, определяемое параметром AccessFileName
файла конфигурации доступа. По умолчанию,
это файл .htaccess.
Пример содержимого файла .htaccess
AuthUserFile /otherdir/.htpasswd
AuthGroupFile /dev/null
AuthName ByPassword
AuthType Basic
<Limit GET>
require user pumpkin
</Limit>
AuthUserFile указывает путь файла паролей, который
должен находиться вне данного каталога.
Limit GET ограничивает доступ по методу GET, предоставляя
его только пользователю pumpkin. Для ограничения других методов
доступа (например, в каталогах
CGI) используется перечисление всех методов:
<Limit GET POST PUT>
require user pumpkin
</Limit>
Для создания файла паролей необходимо воспользоваться утилитой
htpasswd, входящей в состав дистрибутива сервера:
htpasswd -c /otherdir/.htpasswd
pumpkin
После запуска она дважды запросит пароль для пользователя pumpkin
и создаст файл паролей /otherdir/.htpasswd.
Использование нескольких пар имя/пароль
Использование нескольких пар имя/пароль достигается путем описания
группы, в которую входят несколько
пользователей, и указания
имени группы в операторе Limit.
Необходимо создать несколько записей в файле паролей. Этого
можно достичь, не указывая
ключа -c (create) для htpasswd:
htpasswd /otherdir/.htpasswd
peanuts
htpasswd /otherdir/.htpasswd
almonds
htpasswd /otherdir/.htpasswd
walnuts
Создать файл описания группы, назвав его,
например, /otherdir/.htgroup
со следующим содержимым:
my-users: pumpkin peanuts almonds
walnuts
где my-users - имя группы,
pumpkin, peanuts, almonds,
walnuts - список пользователей, входящих в группу.
Изменить файл .htaccess следующим образом:
AuthUserFile /otherdir/.htpasswd
AuthGroupFile /otherdir/.htgroup
AuthName ByPassword
AuthType Basic
<Limit GET>
require group my-users
</Limit>
Все документы данного каталога будут доступны всем членам группы
my-users после проведения процедуры аутентификации
(ввода пароля).
Ограничение доступа по сетевому имени
В этом случае управление доступом осуществляется на основе сравнения
сетевого имени машины - клиента с заранее заданным образцом. Если
выявится совпадение, начинают действовать специальные правила
доступа.
Пример ограничения доступа на чтение. Чтение разрешено всем пользователям
машин домена cnit.nsu.ru:
Содержимое файла .htaccess:
AuthUserFile /dev/null
AuthGroupFile /dev/null
AuthName ExampleAllowFromCNIT
AuthType Basic
<Limit GET>
order deny, allow
deny from all
allow from .cnit.nsu.ru
</Limit>
Оператор order указывает порядок определения требований к доступу:
сначала ограничения, затем разрешения.
deny from all - сначала запрещает доступ для всех,
allow from .cnit.nsu.ru - затем разрешает доступ для машин
домена cnit.nsu.ru.
Оператор AuthName задает имя данного ограничения доступа - произвольную
комбинацию букв и цифр.
Пример запрета на доступ для всех машин домена nstu.nsk.su:
Содержимое файла .htaccess:
AuthUserFile /dev/null
AuthGroupFile /dev/null
AuthName ExampleAllowFromCNIT
AuthType Basic
<Limit GET>
order allow, deny
deny from .nstu.nsk.su
allow from all
</Limit>
Условный оператор
?: также как и в C является условным оператором. Он работает подобно
if-then-else. Если аргумент перед ? - TRUE, то возвращается аргумент
перед :,
в противоположном случае возвращается аргумент после :.
Скалярный или списковый контекст второго и третьего аргументов передается
по наследству.
($a_or_b ? $a : $b) = $c;
Условный оператор (DBIF & DBELSE)
Основным средством динамического определения содержимого документа
являются теги DBIF и
DBELSE, позволяющие производить проверку некоторого условия
и в зависимости от этого формировать результат.
Тег DBIF имеет следующий синтаксис
(тег DBELSE может не
использоваться):
<DBIF значение оператор
значение>
теги HTML и DBML
<DBELSE>
теги HTML и DBML
</DBIF>
В качестве элемента тега DBIF -
"значение",
могут использоваться любой параметр или переменная Cold
Fusion (например, #Form.Name#,
#CGI.User_Agent#), числовое значение, произвольная последовательность
символов (заключенная в кавычки).
Элемент тега DBIF - "оператор"
ограничивается следующим списком:
is - сравнивает
два значения, с учетом регистра, и возвращает значение True
(истина), если эти значения совпадают;
is not
- оператор обратный оператору is;
Contains
- проверяет, содержится ли значение находящееся слева от
оператора в значении справа и возвращает True,
если да;
does not contain
- оператор обратный оператору contains;
great then
- проверяет, что значение слева от оператора больше чем
справа и возвращает True,
если да;
less then
- проверяет, что значение слева от оператора меньше чем
справа и возвращает True,
если да;
greater then or equal
to - оператор
обратный оператору less then;
less then or equal to
- оператор обратный оператору great
then;
Пример
<DBIF #PersonSearch.RecordCount()#
is 0>
<P>Лиц, удовлетворяющих
заданным критериям поиска,
в базе данных не обнаружено!
<DBELSE>
<DBOUTPUT QUERY="PersonSearch">
<HR>
Фамилия Имя Отчество:
#FullName# <BR>
<DBIF #Phone# is "">
Телефон:
#Phone# <BR>
<DBIF>
</DBOUTPUT>
</DBIF>
Установка
Для корректной работы пакета необходимо правильно провести процедуру
установки. Пакет WOW
требует около 2Mb дискового
пространства. На базовом сервере
должны быть установлены:
операционная система семейства Unix;
WWW - сервер;
сервер баз данных Oracle
или сетевой стек Oracle SQL*Net с
возможностью доступа к удаленному серверу баз данных Oracle.
Установка Cold Fusion
Cold Fusion запускается как CGI приложение на различных Web-серверах
под Windows NT и Windows 95 и должен быть совместим с любым сервером поддерживающим CGI.
Cold Fusion тестировался на
совместимость со следующими серверами:
O'Reilly WebSite
Microsoft Internet Server
EMWAC HTTPS
Process Software Purveyor
Netscape Communications/Commerce Server
Internet Factory Communications/Commerce Builder
Spry Safety Web Server
CSM Alibaba
Для связи с различными СУБД Cold
Fusion использует 32-разрядные
ODBC - драйвера. Для корректной
работы с Cold Fusion ODBC -
драйвер должен удовлетворять следующим требованиям:
Это должен быть 32-разрядный драйвер.
Он должен поддерживать Уровень 1 ODBC API.
Должна поддерживаться базовая грамматика SQL.
Для совместимости с функциями ввода даты/времени, драйвер
должен поддерживать соответствующие типы данных.
Для установки и использования Cold
Fusion система должна удовлетворять следующим требованиям:
Операционная система Windows
NT 3.51(или выше) или Windows
95.
Микропроцессор 80386 или выше;
рекомендуется Pentium.
10Mb свободного дискового пространства.
24Mb RAM для Windows NT или 16Mb для Windows 95
Установленная сетевая поддержка TCP/IP.
Установленный WWW сервер.
Для установки Cold Fusion нужно запустить программу SETUP.EXE,
которая должна находится на инсталляционном диске 1.
Помимо копирования файлов, необходимых для работы Cold Fusion,
в процессе установки, в корневой директории с документами
Web сервера создается директория с именем CFPRO. Эта директория содержит:
Тест, для проверки правильности установки системы.
Мини-учебник, в формате HTML, помогающий освоить азы Cold Fusion.
Примеры приложений, демонстрирующие различные способы использования Cold Fusion.
Чтобы проверить правильность установки Cold Fusion, нужно открыть документ, URL
до которого имеет вид
http://myserver/cfpro/getstart.htm,
где myserver
- имя или IP адрес вашего Web сервера.
Верстка таблиц
Таблицы являются мощнейшим средством HTML для верстки страниц.
До появления в языке HTML средств верстки таблиц, нельзя было
создать даже самый простой
многоколончатый текст или сводную таблицу, то после появления такой
возможности Web-дизайнеры стали использовать ее в полной мере и добиваться
сложных эффектов.
Создается таблица с помощью конструкции
<TABLE параметры >
<CAPTION>Заголовок</CAPTION>
<TR параметры>
<TD параметры>
...
</TD>
....
</TR>
</TABLE>
Тег TABLE начинает описание таблицы и может иметь следующие параметры:
BORDER - определяет толщину рамки таблицы. Если указано нулевое значение то рамка не отображается. Если этот параметр не указан, его значение считается нулевым (рамка не отображается).
WIDTH, HEIGHT - указывает размеры таблицы, если они должны быть жестко заданы.
ALIGN - определяет, как должна быть выровнена таблица: справа (RIGHT), слева (LEFT) или в центре (CENTER) страницы.
CELLSPACING - число точек между отдельными ячейками в таблице.
CELLPADDING - число точек между рамкой и содержимым ячейки.
С помощью тега <TR параметры>...</TR> оформляются строки таблиц.
Он может иметь следующие параметры:
ALIGN - используется для задания способа горизонтального форматирования данных внутри
ячеек: они могут прижиматься к правому (RIGHT), левому (LEFT) краям или
центрироваться (CENTER).
VALIGN - используется для задания способа вертикального форматирования данных внутри
ячеек: они могут прижиматься к верхнему (TOP), нижнему (BOTTOM) краям,
центрироваться (MIDDLE) или иметь общую базовую линию (BASELINE).
Конкретные ячейки задаются с помощью тега <TD параметры>...</TD>,
где параметры могут быть следующими:
WIDTH - задает ширину ячейки.
COLSPAN - определяет, сколько колонок таблицы ячейка будет перекрывать.
ROWSPAN - определяет, сколько строк таблицы ячейка будет перекрывать.
NOWRAP - если этот параметр указан, содержимое ячеек не будет переноситься, чтобы влезать в ширину ячейки.
BGCOLOR - параметр, поддерживаемый современными браузерами: указывает цвет фона ячейки в виде RGB-триплета или символьного имени.
Еще один тег для оформления ячеек таблиц - тег <TH>...</TH> - нужен для
задания заголовочных ячеек. Он во всем совпадает с тегом <TD>, но
в отличие от него, содержимое выдается жирным шрифтом и центрируется.
Если нужно задать заголовок ВСЕЙ таблицы, используйте тег
<CAPTION параметры>...</CAPTION>. Он должен быть внутри тега <TABLE>,
но вне описания ячеек. Тег имеет один параметр:
ALIGN - указывает положение заголовка: он может быть в верхней (TOP) или нижней (BOTTOM) части таблицы.
Пример:
<TABLE BORDER=1 CELLSPACING=2 CELLPADDING=1 WIDTH=500>
<TR>
<TD COLSPAN=3 ALIGN=CENTER>A</TD>
</TR>
<TR>
<TD ROWSPAN=2 ALIGN=CENTER WIDTH="30%">B</TD>
<TD ROWSPAN=2 ALIGN=CENTER WIDTH="40%">C</TD>
<TD ALIGN=CENTER WIDTH="30%">D</TD>
</TR>
<TR>
<TD ALIGN=CENTER>E</TD>
</TR>
</TABLE>
Включение в шаблон других шаблонов
По мере усложнения приложений, разрабатываемых с использованием
Cold Fusion, появляется необходимость
упростить используемые шаблоны.
Одним из способов решения этой проблемы, предлагаемых в Cold
Fusion, является выделение из шаблонов часто используемых
блоков, таких как запросы и области вывода, и их многократное
использование в других шаблонах. Для включения часто используемых
шаблонов в другой шаблон, используется тег DBINCLUDE.
Тег DBINCLUDE может быть расположен
в любом месте шаблона, кроме как в тегах DBQUERY,
DBOUTPUT и DBTABLE. Тег
DBINCLUDE имеет атрибут TEMPLATE
который задает путь до файла с шаблоном. Этот шаблон будет
обработан Cold Fusion как
часть основного шаблона (то есть, в нем могут использоваться запросы,
уже запущенные в основном шаблоне, а также ссылки на параметры
формы, URL и CGI).
Приведем пример включения в шаблон шаблона с именем 'test.dbm':
<DBINCLUDE TEMPLATE="test.dbm">
Вложенные области вывода и группирования
Теги DBOUTPUT могут вкладываться
друг в друга, с целью сгруппировать области вывода. Группирование
достигается с помощью использования атрибута GROUP
в теге DBOUTPUT, который
содержит другой тег DBOUTPUT.
Этот атрибут определяет поле по которому будет производится группирование.
Внешний тег DBOUTPUT обычно
используется для вывода заголовка группы , а внутренний - для
вывода записей содержащихся в группе.
Приведем пример вывода сотрудников организации сгруппированных
по отделам:
<DBQUERY NAME="ListEmployees"
DataSource="Employees"
SQL="SELECT * FROM Emp ORDER
BY Department">
<DBOUTPUT QUERY="ListEmployees"
GROUP="Department">
<P> <H2>#ListEmployees.Department#</H2>
<UL>
<DBOUTPUT>
<LI> #FullName# ##
</DBOUTPUT>
</UL>
</DBOUTPUT>
Обратим внимание на то, если поле используется для группирования,
то результат запроса должен быть отсортирован по этому полю. Если
используется многоуровневое группирование (ограничений на количество
уровней вложенности тегов DBOUTPUT
нет), то соответственно в SQL
- выражении должна быть задана многоуровневая сортировка
(например, ORDER BY Country, Region).
Вставка иллюстраций в HTML-документы
Для вставки изображений в документ служит тег <IMG>. Это пустой тег, следовательно, закрывающего тега для него не существует. У тега есть несколько параметров:
SRC - обязательный параметр, указывающий URL файла с изображением.
ALT - рекомендуемый параметр, строка, заменяющая изображение при загрузке и в браузерах без поддержки графики.
WIDTH, HEIGHT - рекомендуемые параметры, горизонтальный размер растра изображения. При загрузке изображения браузер может отображать на его месте в документе рамку соответствующего размера.
BORDER - толщина рамки вокруг изображения, если изображение является частью активной зоны ссылки. Если BORDER=0, то рамка не будет отображаться.
HSPACE, VSPACE - позволяют задать свободное пространство вокруг изображения.
ALIGN - (TOP или BOTTOM или MIDDLE) положение текста относительно изображения. (LEFT или RIGHT) Положение изображения относительно окна браузера.
USEMAP - указывает, что изображение имеет активные зоны, описанные с помощью тега MAP в самом документе.
ISMAP - указывает, что изображение имеет активные зоны, и информацию о координатах выбранной точки следует передавать серверу.
Встроенные функции
abs VALUE
Возвращает абсолютное значение аргумента.
accept NEWSOCKET, GENERICSOCKET
подобно системному вызову accept(2) ждет соединения.
Возвращает запакованный адрес, если соединение произошло успешно и FALSE в
противоположном случае.
atan2 Y,X
Возвращает arctg(Y/X).
bind SOCKET, NAME
Привязывает сетевой адрес к сокету,
также как системный вызов bind в OS UNIX или любой другой
системе, поддерживающей BSD Sockets. Если привязка произошла
успешно, возвращает TRUE, в противном случае - FALSE. Переменная NAME должна
содержать запакованный адрес, соответствующего для сокета типа.
Тип адреса для разных видов сокетов определяется в терминах языка C структурой
sockaddr, которая представляет собой абстрактный тип, содержащий
все данные, необходимые для сокета.
binmode FILEHANDLE
Позволяет читать или писать файл с соответствующим
дескриптором в бинарном режиме.
bless REF, PACKAGE
Эта функция присоединяет объект на который указывает
ссылка REF, к пакету PACKAGE, если он определен, если же он опущен, то к текущему
пакету. Для удобства возвращает ссылку, так как bless() часто является последним
оператором в конструкторе.
caller EXPR
Возвращает контекст текущего вызова подпрограммы. В скалярном
контексте возвращает TRUE, если мы находимся внутри подпрограммы, eval() или
require(). FALSE в противоположном случае. В списковом контексте возвращает:
($package, $filename, $line) = caller;
С аргументом EXPR возвращает более сложную информацию, которая используется
отладчиком для печати карты стека. Значение EXPR отмечает глубину стека до
текущей записи.
($package, $filename, $line,
$subroutine, $hasargs, $wantargs) = caller($i);
chdir EXPR
Изменяет текущую директорию на указанную в EXPR, если это
возможно. Если EXPR опущено, то устанавливает в качестве текущей директории
домашнюю директорию. Возвращает TRUE в случае успеха и FALSE иначе.
chmod LIST
Изменяет права доступа к файлам указанным в LIST. Первым
аргументом должна быть маска доступа в цифровом формате.
Возвращает число
файлов права доступа к которым были успешно сменены.
$cnt = chmod 0700 'foo','bar';
chmod 700 @executables;
chown LIST
Изменяет хозяина или группу, которой принадлежит список файлов.
Первыми двумя аргументами должны быть uid и gid. Возвращает количество успешных
изменений.
chr NUMBER
Возвращает символ, представленный номером NUMBER в наборе
символов. Например, chr(65) вернет A.
close FILEHANDLE
Закрывает файл с дескриптором FILEHANDLE. Для более подробной
информации читайте manual page.
open(OUTPUT '/usr/home/petrov');
...
close OUTPUT;
closedir DIRHANDLE
Закрывает каталог открытый вызовом opendir().
connect SOCKET,NAME
Пытается соединиться с удаленным сокетом (по аналогии с системным вызовом).
Возвращает TRUE в случае успешного соединения и FALSE в противоположном случае.
Переменная NAME должна содержать запакованный адрес соответствующего данному
сокету типа.
cos EXPR
Возвращает косинус EXPR, выраженного в радианах. Если EXPR опущено,
возвращает косинус $_.
dbmopen ASSOC, DBNAME, MODE
Связывает dbm(3) или ndbm(3) файл с
ассоциативным массивом. ASSOC - имя ассоциативного массива. DBNAME - имя базы данных
(без .dir или .pag расширения). Если база данных не существует, то она создается
с правами доступа указанными в MODE.
dbmopen(%HIST,'/usr/lib/news/history', 0600);
while (($key, $val) = each %HIST){
print $key, '=', unpack('L',$val),\n;}
dbmclose(%HIST);
dbmclose ASSOC
Прерывает связь между файлом и ассоциативным массивом.
defined EXPR
Возвращает TRUE или FALSE, в зависимости от того определено
значение EXPR или нет. Многие операции возвращают неопределенное значение в
случае конца файла, неинициализированной переменной, системной ошибки или при
подобной ситуации. Если речь идет о хэше, то defined покажет только определены ли
ли величины, ничего не говоря о существовании ключей. Для определения существования
ключей используется функция exists().
delete EXPR
Стирает указанную величину. Возвращает удаленную величину
или значение не определено в случае, если удаление не произошло.
foreach $key (keys %array) {
delete $array{$key};
}
Но более быстро то же самое можно сделать используя функцию undef().
die LIST
Вне eval() печатает значение LIST в STDERR и выходит из программы с
текущим значением $!. Если значение $! есть ноль, то принимает значение $? >> 8.
Если значение $? >> 8 есть ноль, то принимает значение 255. Внутри eval()
сообщение об ошибке помещается в переменную $@ и eval() прерывается с
неопределенным значением.
open(FL, "/root/rm-rf") die "Can't open file.\n";
do BLOCK
Функцией не является. Возвращает значение последней операции
внутри блока.
do EXPR
Использует величину EXPR как имя файла и далее запускает содержимое
этого файла, как программу на Perl. Обычно это используется для включения
библиотечных подпрограмм.
do 'stat.pl';
Это то же самое, что:
eval 'cat stat.pl';
Однако подключать библиотечные модули более удобно используя use и require.
each ASSOC_ARRAY
Возвращает массив из двух элементов, содержащий ключ
и значение из хэша, причем по очереди перебирает все пары ($key, $value).
while (($key,$value) = each %ENV){
print " $key = $value \n";
}
eof FILEHANDLE
Возвращает 1, если следующее считывание возвращает конец
файла или если FILEHANDLE не был открыт. При опущении аргумента eof обрабатывает
последний файл, из которого происходило считывание. Но на практике эта функция
редко используется, так как в Perl-е операторы чтения возвращают неопределенное
значение в конце файла.
eval EXPR
EXPR выполняется как маленькая программа в контексте основной
программы. Определенные переменные и подпрограммы остаются определенными и в
дальнейшем. Возвращается значение, которое возникает при обработке последнего
выражения. Если EXPR опущено, то обрабатывается $_.
exec LIST
Исполняет внешнюю программу и НИКОГДА не возвращает управление.
На самом деле (в UNIX) производится системный вызов семейства exec, который
подменяет программу, исполняющуюся в рамках текущего процесса.
Если LIST представляет собой список из более, чем одного аргумента, то вызывается execvp(3)
с аргументами из LIST. Если аргумент только один, то он проверяется на метасимволы
shell. Если они присутствуют, то он далее передается /bin/sh -c для обработки.
Если же их нет, то аргумент передается напрямую execvp, который более эффективен.
exists EXPR
Возвращает TRUE, если в хэше есть ключи и даже в том случае,
когда значения VALUE не определены.
exit EXPR
Обрабатывает EXPR и осуществляет немедленный выход с полученной
величиной.
$ans = <STDIN>;
exit 0 if $ans =~ /^[Xx]/;
Если EXPR опущено, то осуществляет выход с нулевым статусом.
exp EXPR
Возвращает е (основание натурального логарифма e = 2.718281828...)
в степени EXPR. По умолчанию обрабатывается $_.
fork
Делает системный вызов fork(2). Возвращает pid (идентификатор
процесса) дочернего процесса родительскому процессу и 0 дочернему процессу.
Значение не определено в случае неуспешного завершения команды. Неуспех может
произойти, например, в случае установки в системе ограничения на количество
процессов данного пользователя. Вот небольшой пример использования этой
функции.
unless ($pid = fork) {
unless (fork) {
exec "what you really wanna do";
die "no exec";
some_perl_code_here;
exit 0;
}
exit 0;
}
waitpid($pid,0);
getc FILEHANDLE
Возвращает следующий символ из файла чтения,
присоединенный к FILEHANDLE или пустую строку в случае конца файла. Если
FILEHANDLE опущен, то считывание происходит из STDIN.
goto LABEL
Эта функция осуществляет переход на точку программы LABEL и
продолжает выполнение программы с этой точки. Точка не может находиться внутри
подпрограммы или foreach цикла, так как в этих случаях требуется предварительная
инициализация.
Использовать в качестве LABEL выражение не рекомендуется, хотя такая возможность
и предоставляется.
grep BLOCK, LIST
grep EXPR, LIST
Обрабатывает BLOCK или EXPR для каждого элемента LIST
и возвращает список элементов для которых значение выражения TRUE. В скалярном
контексте возвращает число элементов для которых EXPR TRUE.
hex EXPR
Возвращает десятичное значение EXPR, интерпретируемого как
шестнадцатеричная строка. По умолчанию обрабатывает переменную $_.
kill LIST
Посылает сигнал списку процессов LIST, первым элементом списка
должен быть номер сигнала. Возвращает число процессов, которым сигнал был
послан успешно. В отличие от shell, если номер сигнала отрицателен, то он посылается
группе процессов.
int EXPR
Возвращает целую часть EXPR, если EXPR опущено, то
обрабатывает переменную $_.
join EXPR,LIST
Соединяет в единую строку строки из LIST. При этом
в качестве разделителей между элементами LIST ставит значение EXPR. Например:
$_ = join( ':',$login,$passwd,
$uid,$gid,$gcos,$home,$shell);
keys ASSOC_ARRAY
Возвращает обычный массив, состоящий из ключей
ассоциативного массива ASSOC_ARRAY. В скалярном контексте возвращает число
ключей.
@keys = keys %ENV;
length EXPR
Возвращает длину EXPR в символах. По умолчанию обрабатывает
переменную $_.
link OLDFILE,NEWFILE
Создает файл NEWFILE, присоединенный к файлу
OLDFILE. (В OS UNIX создание нескольких имен для одного файла) Возвращает 1
в случае успеха и 0 иначе.
listen SOCKET, QUEUESIZE
Делает то же самое, что и одноименный системный
вызов. Возвращает TRUE в случае успеха, FALSE иначе.
local EXPR
На самом деле гораздо эффективнее использовать функцию my.
Функция local делает перечисленные переменные локальными в блоке, подпрограмме,
eval или do. Если переменных более, чем одна, то они должны объединяться скобками.
sub RANGEVAL{
local($min,$max,$thunk) = @_;
local $result = '';
local $i;
for ($i = $min; $i < $max; $i++) {
$result = eval $thunk;
}
$result;
}
log EXPR
Возвращает натуральный логарифм EXPR, по умолчанию обрабатывает
переменную $_.
map EXPR,LIST
Подставляет каждый элемент из списка LIST в EXPR (которое
может быть блоком) и возвращает список полученных после обработки величин.
@chars = map(chr, @nums);
mkdir FILENAME,MODE
Создает директорию с именем FILENAME и правами доступа
указанными в переменной MODE. В случае успеха возвращает 1, в противном случае
возвращает 0 и устанавливает значение переменной $!(errno).
my EXPR
Эта функция (так же как и описанная ранее функция local) делает
перечисленные переменные локальными в пределах блока, подпрограммы, eval или do.
Если список состоит более чем из одного элемента, то он должен быть заключен в
скобки. Все элементы в списке должны быть фактическими параметрами. В отличие от local,
переменные локализованные функцией my не видны снаружи блока, подпрограммы или
другой конструкции, внутри которой my употребляется.
next LABEL
Употребляется подобно continue оператору в C - запускает
следующую итерацию цикла.
line: while (<STDIN>) {
next line if /^#/;
...
}
oct EXPR
Возвращает десятичное значение EXPR, интерпретируемого как
строка в восьмеричном формате. (Если строка начинается с 0x, то интерпретируется,
как строка в шестнадцатеричном формате.)
open FILEHANDLE,EXPR
Открывает файл, имя которого описано в переменной
EXPR и привязывает его к FILEHANDLE. Если EXPR опущено, то переменная с таким
же именем как FILEHANDLE содержит имя файла. Если имя файла начинается со знака:
?
< файл открывается на чтение.
> файл открывается на запись.
>> файл открывается для добавления.
| имя файла расценивается как команда,
с которой будет организован программный канал,
то есть вывод в дескриптор FILEHANDLE будет
передаваться на вход программе EXPR.
Если знак | указывается после имени команды, то вывод этой команды
будет ассоциирован с дескриптором FILEHANDLE, из которого будет производиться
чтение. Интересно, что
нельзя открыть двойной программный канал, то есть ассоциировать ввод и вывод
команды с дескриптором файла (что соответствовало бы системному вызову popen в
UNIX).
В случае, когда имя файла оканчивается вертикальной чертой, оно расценивается
как имя команды, вывод которой будет интерпретироваться как ввод из файла
(аналог функции popen(3)).
open(LOG, '>>/usr/spool/news/twitlog');
open DIRHANDLE,EXPR
Открывает директорию с именем EXPR, возвращает TRUE
в случае успеха.
ord EXPR
Возвращает числовое значение в таблице ASCII первого символа EXPR.
По умолчанию обрабатывает переменную $_.
print FILEHANDLE,LIST
Печатает строку или несколько строк, разделенных
запятой. FILEHANDLE может быть именем скалярной переменной, содержащей дескриптор
файла. Если эта переменная опущена то печать идет в выбранный канал вывода.
Если переменная LIST тоже опущена, то печатает переменную $_ в STDOUT.
printf FILEHANDLE, LIST
Эквивалентно print FILEHANDLE, sprintf(LIST).
Первый аргумент LIST интерпретируется как формат печати.
rand EXPR
Возвращает выбранное случайным способом значение между 0 и EXPR.
EXPR должно быть положительным. По умолчанию производит выборку в диапазоне между
0 и 1. (Замечание: если ваша функция постоянно возвращает слишком большие или
слишком малые значения, то скорее всего была допущена ошибка при компиляции
вашей версии Perl. Было установлено неверное значение RANDBITS.)
read FILEHANDLE,SCALAR,LENGTH,OFFSET
Считывает LENGTH байт
данных из FILEHANDLE в переменную SCALAR. Возвращает число считанных байт или неопределенное значение
в случае ошибки. Если вы хотите считать данные не с начала строки,
то для этого нужно установить значение переменной OFFSET.
readlink EXPR
Возвращает значение символьной ссылки, если она существует.
Если же ее нет, то выдает fatal error и устанавливает значение переменной $!.
По умолчанию обрабатывает переменную $_.
redo LABEL
Перезапускает цикл без повторной обработки условия. Блок continue,
если он есть не исполняется. Если LABEL опущена, то команда выполняется для внутреннего
цикла.
line: while(<STDIN>) {
while ($_ ne '\') {
if (ord $_ < 86) {
...
}
redo line;
}
print;
}
ref EXPR
Возвращает TRUE, если EXPR является ссылкой и FALSE в противоположном
случае. Полученное значение зависит от типа объекта на который указывает ссылка.
Существует несколько встроенных типов данных:
REF SCALAR ARRAY HASH CODE GLOB
Если объект, на который указывает ссылка, находится в пакете (package), то в таком
случае возвращается имя пакета.
if (ref($r) eq "HASH") {
print " Это ссылка на ассоциативный массив.\n";
}
if (!ref($r)) {
print " А это не ссылка вовсе! \n";
require EXPR
Используется для подключения модулей.
require "oraperl.pm";
reset EXPR
Обычно используется в continue блоке в конце цикла для
переустановки значений переменных. EXPR интерпретируется как список отдельных
символов. Значения переменных и массивов, имена которых начинаются с одного из этих
символов списка переустанавливаются. Например:
?
reset 'X' переустановит все X переменные
reset 'a-z' переустановит все переменные,
имена которых состоят из маленьких букв.
rm FILENAME
Удаляет файл или директорию с заданным именем. Возвращает
1 в случае успеха, 0 в противоположном случае и устанавливает значение переменной
$!. По умолчанию обрабатывает аргумент $_.
scalar EXPR
Выражение будет трактоваться в скалярном контексте. Возвращает
значение EXPR.
seek FILEHANDLE, POSITION, WHENCE
Позволяет установить курсор
в файле, определенном в переменной FILEHANDLE, на позицию POSITION в режиме,
указанном в переменной WHENCE. Если переменная WHENCE содержит значение 0, то
позиция отсчитывается от начала файла, если 1 то от текущей позиции и если 2, то
от конца файла. Возвращает 1 в случае успеха и 0 иначе.
select FILEHANDLE
Возвращает текущий выбранный FILEHANDLE. Направляет
вывод в FILEHANDLE.
select RBITS,WBITS,EBITS,TIMEOUT
Вызывает системный вызов select(2) с
определенной аргументами битовой маской.
shift ARRAY
Сдвигает массив ARRAY влево с удалением первого элемента и
возвращает удаленный элемент.
Если в массиве нет элементов, то возвращает неопределенное значение. Если ARRAY
опущен, то обрабатывает массив @ARGV в главной программе и массив @_ в подпрограммах.
sin EXPR
Возвращает синус выражения EXPR (выраженного в радианах).
Если
аргумент опущен, то обрабатывается переменная $_.
sleep EXPR
Дает процессу команду остановки на EXPR секунд. Если аргумент
опущен, то процесс зависает навсегда. В таком случае ``сон'' можно прервать, послав ему
сигнал. Возвращает число секунд, в течение которых процесс был в состоянии остановки.
socket SOCKET,DOMAIN,TYPE,PROTOCOL
Создает сокет и привязывает его к
дескриптору файла SOCKET. Остальные параметры описываются так же, как и в одноименном
системном вызове. В начале программы необходимо написать use Socket;.
sort SUBROUTINE,LIST
Сортирует аргументы из LIST и возвращает отсортированный список.
Если список является массивом, то несуществующие элементы массива не учитываются
и не возвращаются. Ниже приведено несколько примеров.
@articles = sort @files;
- Лексическая сортировка без использования подпрограммы.
@articles = sort{$a cmp $b} @files;
- То же самое, но с использованием подпрограммы.
@articles = sort{$a <=> $b} @files;
- Численная сортировка по возрастанию.
splice ARRAY,OFFSET,LENGTH,LIST
Удаляет из массива ARRAY элементы,
отмеченные в переменных OFFSET и LENGTH и заменяет их элементами списка LIST,
если таковые имеются. Возвращает удаленные из массива элементы. Длина массива
растет или уменьшается, если это необходимо. Если переменная LENGTH опущена, то
удаляет все, начиная с OFFSET.
split /PATTERN/,EXPR,LIMIT
Разбивает строку на массив строк и возвращает
его. В скалярном контексте возвращает число полученных полей и помещает
полученный массив в @_. Если EXPR опущено то разбивается строка $_. Если PATTERN
тоже опущен, то разбиение происходит по символу пробел. Символы, указанные в
PATTERN, служат разделителями для полей. Разделители могут быть длиннее, чем один
символ. Если переменная LIMIT задана и имеет неотрицательное значение, то разбиение
будет происходить на число полей не более указанного в LIMIT. Если переменная
не определена, то пустые поля отбрасываются, если имеет отрицательное значение,
то это интерпретируется Perl-ом, как отсутствие ограничения на длину возвращаемого
массива. Если шаблону соответствует пустая строка, то EXPR будет разбито на
отдельные символы. Например:
print join(':',split(/ */,'hi there'));
напечатает строку h:i:t:h:e:r:e.
sqrt EXPR
Возвращает корень квадратный из значения EXPR. По умолчанию
обрабатывает переменную $_.
system LIST
Делает то же самое, что и функция exec LIST, за одним исключением:
вместо того, чтобы просто начать выполнять программу , как это делает exec, system
делает fork и порождает еще один процесс, причем родительский процесс ждет завершения
дочернего.
tell FULEHANDLE
Возвращает текущую позицию курсора в файле FILEHANDLE.
Если аргумент опущен, то обрабатывает файл, который читался последним.
tie VARIABLE,PACKAGENAME,LIST
Привязывает переменную к пакету, который будет заносить
значения в эту переменную. Переменная VARIABLE содержит имя переменной, переменная
PACKAGENAME содержит имя пакета. Дополнительные аргументы передаются методу new
этого пакета. Обычно это такие аргументы, которые в дальнейшем могут быть переданы
в качестве параметров dbm_open() функции из C.
tie(%HIST, NDBM_File,'/usr/lib/news/history', 1, 0);
while(($key,$val) = each %HIST) {
print $key, '= ', unpack('L',$val),"\n";
}
untie(%HIST);
Пакет, реализующий ассоциативный массив, должен содержать следующие методы:
TIEHASH objectname, LIST
DESTROY this
FETCH this, key
STORE this, key, value
DELETE this, key
EXISTS this, key
FIRSTKEY this
NEXTKEY this, lastkey
Пакет, реализующий обычный массив, должен содержать следующие методы:
TIEARRAY objectname, LIST
DESTROY this
FETCH this, key
STORE this, key, value
Пакет, реализующий скаляры, должен содержать следующие методы :
TIESCALAR objectname, LIST
DESTROY this
FETCH this
STORE this, value
truncate FILEHANDLE, LENGTH
Обрезает файл FILEHANDLE до заданной длины.
undef EXPR
Делает значение EXPR неопределенной величиной, в случае,
когда аргумент опущен ничего не меняет. Не следует пытаться применять эту
функцию к зарезервированным переменным, потому что результат может оказаться
непредсказуемым.
unlink LIST
Удаляет список файлов и возвращает число удачно удаленных
файлов. Если вы не являетесь суперпользователем, то эта функция не может
удалять каталоги. Даже в случае, когда программа запускается с привилегиями
суперпользователя, будьте осторожны, лучше использовать функцию rmdir.
untie VARIABLE
Разрывает связь между переменной и пакетом.
unshift ARRAY, LIST
Производит действие противоположное действию функции
shift. Присоединяет LIST к началу массива ARRAY и возвращает новое количество
элементов в массиве.
use Module LIST
Осуществляет присоединение модуля к программе.
use strict qw(subs,vars,refs);
values ASSOC_ARRAY
Возвращает обычный массив, состоящий из значений
ассоциативного массива ASSOC_ARRAY. В скалярном контексте возвращает число
элементов полученного массива. Элементы массива могут располагаться в произвольном
порядке.
wantarray
Возвращает TRUE, если контекст исполняющейся подпрограммы
списковый, FALSE в противоположном случае.
write
создает запись (возможно состоящую из нескольких строк) в
соответствующем файле, используя формат ассоциированный с этим файлом. Формат
для текущего канала вывода может быть установлен посредством присваивания
переменной $~{ } имени формата.
Многие организации используют электронные базы
Многие организации используют электронные базы данных (БД) для поддержки своих рабочих процессов. Часто это системы на одного - двух пользователей, выполненные с использованием dbf - ориентированных средств разработки: Clipper, Dbase, FoxPro, Paradox, Access. Обычно используется ряд таких баз, независимых друг от друга. Если информация, хранимая в таких БД, представляет интерес не только для непосредственных пользователей,
то для ее дальнейшего распространения используются бумажные отчеты и справки, созданные
базой данных.
С появлением локальных сетей, подключением таких сетей к Интернет, созданием внутрикорпоративных, сетей, появляется возможность с любого рабочего места организации получить доступ к информационному ресурсу сети. Однако, при попытке
использовать существующие БД возникают проблемы связанные с требованием
к однородности рабочих мест (для запуска "родных"
интерфейсов), сильнейшим трафиком в сети (доступ идет напрямую к файлам БД),
загрузкой файлового сервера и невозможностью удаленной
работы (например, командированных сотрудников). Решением проблемы могло бы стать использование унифицированного интерфейса WWW для доступа к ресурсам организации.
Технология World Wide Web, в переводе "Всемирная паутина",
получила столь широкое распространение из-за простоты своих пользовательских интерфейсов. Принцип "жми на то, что интересно", лежащий в основе гипертекста, интуитивно понятен. В технологиях WWW все ключевые понятия просматриваемого документа: слова, картинки - имеют возможность "раскрыться" новым документом, развивающим это понятие. Такой способ представления информации называется "гипертекстом", а документы, представленные в таком виде - "гипертекстовыми
документами". Для описания этих документов используется специальный язык - язык описания гипертекстовых документов или HTML (англ. вариант HyperText Markup Language).
Из этих предпосылок возникает задача преобразования накопленных данных в гипертекстовые документы WWW, задача поддержки актуальности преобразованной структуры.
Другими словами, задача предоставления WWW - доступа к существующим
базам данных.
Web- страницы описываются на специальном языке, называемом HTML (HyperText
Markup Language, Язык разметки гипертекстовой информации), ставшем основным языком описания документов в Internet. HTML является простым
подмножеством универсального языка разметки документов SGML (Standard Generalized Markup Language, Стандартный язык разметки документов),
являющегося стандартом для обмена документами между различными платформами. Точнее, весь синтаксис HTML полностью описывается с помощью SGML DTD
(Document Type Definition). По этой причине почти все программы, совместимые с SGML, могут быть использованы при подготовке HTML-документов.
За сравнительно короткое время разработчики Web-страниц прошли путь от простого перевода текстовых документов на язык HTML до создания
красочных, искусно оформленных интерактивных страниц, с умело используемой графикой и различными стилями размещения текста на странице. Появилась профессия
под названием ``Web-дизайнер'', то есть человек, специализирующийся на создании Web-страниц высшего качества. Некоторые современные
Web-страницы можно со всей ответственностью назвать произведениями искусства.
Интересно отметить некоторые особенности, отличающие верстку информации
для Web и верстку для ``обычной'', то есть, бумажной технологии передачи документов. В отличие от языков описания печатных документов,
вроде известного языка PostScript, упор делается на переносимость информационного наполнения
страниц, а не их внешнего оформления. Поясним сказанное на примере:
при переносе документа на языке PostScript между двумя компьютерами гарантируется сохранение его внешнего вида, то есть размеров,
шрифтового оформления; тогда как для HTML-документов гарантируется лишь
сохранение логической структуры. Это происходит потому, что никто не гарантирует, что устройство,
на котором пользователь будет просматривать Web-страницу, не окажется черно-белым алфавитно-цифровым терминалом 1970-го года выпуска! Или же
что программа просмотра, используемая пользователем, способна корректно
отобразить графические вставки в различных форматах. И поэтому Web-дизайнер
несет особую ответственность за представление информации на своих страницах.
Широкие возможности WWW - технологии по представлению пользователям
Internet информации, включая текст, картинки, графики, видео и звуковые дорожки,
обусловили процесс бурного роста сети WWW - серверов и Internet
в целом. Целью данного пособия является освещение технологии работы
и процессов установки и администрирования WWW - сервера, т.е.
той части сети, которая отвечает за предоставление гипертекстовой
информации по запросам пользователей сети.
Пакет Cold Fusion фирмы Allaire - это средство для быстрой разработки интерактивных, динамических
документов для Web основанное на обработке информации из баз данных, в основе которого лежит
следующий набор технологий:
HTML (Hyper-Text Markup Language)
CGI (Common Gateway Interface)
SQL (Structured Query Language)
ODBC (Open Database Connectivity)
Разработка приложений с использованием Cold Fusion не требует программирования
на таких языках как Perl, C/C++, Visual Basic или Delphi.
Вместо этого вы создаете приложение, встраивая в обычный (стандартный) HTML
файл специальные теги для работы с базами данных.
В данной главе рассматривается Cold Fusion версии 1.5 .
В данной главе отчета описывается свободно - распространяемое
программное обеспечение - пакет WOW.
Для освоения этого материала необходимо знание языка SQL
и его процедурного
расширения PL/SQL от фирмы
Oracle. Кроме этого необходимо
знание основ администрирования сервера Oracle.
Информацию по PL/SQL Вы
можете получить из документации по серверу Oracle,
книга "PL/SQL Users Guide
and Reference". Информацию об основах администрирования
сервера Oracle можно получить
из этой же документации, книга
"Oracle7 Server Administration
Guide".
Пакет WOW предназначен для
использования под ОС Unix.
Выполнение запросов к базам данных
Для выполнения запросов к базе данных используется тег DBQUERY.
Этот тег имеет следующий синтаксис:
<DBQUERY NAME="имя запроса"
DATASOURCE="имя источника данных odbc"
SQL="sql выражение"
TIMEOUT=n MAXROWS=n DEBUG>
Атрибут NAME определяет имя
запроса, которое используется далее для отображения результата
выполнения запроса. Имя запроса должно начинаться с буквы и может
содержать буквы и цифры (пробелов быть не должно).
Атрибут DATASOURCE задает
имя источника данных ODBC,
который должен быть создан с помощью интерфейса администратора
Cold Fusion.
Ключевым атрибутом тега DBQUERY,
является атрибут SQL, который
собственно и определяет запрос к базе данных на языке SQL
(для улучшения читабельности, допускается расположение значения
атрибута SQL на нескольких
строках).
Создавая SQL запрос, следует
помнить, что конкретная база данных может иметь свои особенности
в синтаксисе SQL, использование
которых ограничивается этой базой данных. Чтобы проверить, является
ли конкретное SQL выражение
совместимым с ODBC и независимым
от конкретной базы данных, лучше всего использовать Microsoft
Query, входящий в состав Microsoft
Office. Для этого нужно в меню Microsoft
Query выбрать "Файл/Выполнить
SQL", в появившемся
окне диалога ввести предложение SQL,
выбрать источник данных ODBC,
нажав на кнопку "Источники...",
после чего нажать на кнопку "Выполнить".
Этот продукт можно также использовать и для создания SQL
- выражений, используя для этого визуальные средства создания
запросов. Получить SQL - выражение
созданного таким образом запроса можно нажав на кнопку "SQL"
в панели инструментов.
Атрибут MAXROWS является необязательным
и определяет максимальное количество записей, которые могут быть
возвращены в результате выполнения запроса.
Атрибут TIMEOUT также является
необязательным и определяет максимальное количество миллисекунд
для выполнения запроса, до выдачи сообщения об ошибке.
Заметим,
что этот атрибут поддерживается только некоторыми ODBC
- драйверами (например, драйвером
для MS SQL Server 6.0).
Атрибут DEBUG используется
для отладки запросов. При наличии этого атрибута пользователю
отправляется дополнительная информация о выполнении этого запроса,
такая как текст выполненного SQL
- запроса, число возвращенных записей и др.
Приведем пример запроса с именем 'AllPersons',
который возвращает все записи таблицы 'Persons'
из базы данных, с которой связан источник данных ODBC
с именем 'Person DB':
<DBQUERY NAME="AllPersons"
DATASOURCE="Person DB"
SQL="select * from Persons">
Для динамической настройки SQL -
выражения можно использовать параметры, переданные в шаблон. Это
могут быть параметры, переданные из формы, URL,
а также переменные CGI. Параметры,
используемые внутри SQL -
выражения, должны быть обрамлены символом "#"
(например #Name#).
При обработке запроса Cold
Fusion ищет параметр с таким именем среди параметров, полученных
из формы, в URL или среди
переменных CGI. При нахождении
подходящего параметра его значение подставляется вместо соответствующей
ссылки на параметр.
Примеры использования параметров в SQL
-выражении
Пример 1
Предположим что обрабатывается URL
"/cgi-shl/dbml.exe?Template=prs.dbm&Id=22",
а атрибут SQL в DBQUERY
имеет вид
SQL="select * from Persons
where Id = #Id#",
тогда в базу данных будет передано следующее SQL - выражение:
select * from Persons where Id
= 22 .
Пример 2
Предположим, что в шаблон передан параметр FirstLetters
и нужно найти в таблице Persons
записи, в которых первые
буквы в поле FullName совпадают
со значением этого параметра. Значение атрибута SQL
в этом случае будет следующим:
SQL="select * from Persons
where FullName like '#FirstLetters#%'"
Следует обратить внимание на то, что маска, состоящая из параметра
и символа '%', в отличие от
предыдущего примера, обрамлена одинарными кавычками.Это связано
с тем, что поле Id из примера
1 имеет числовой тип, а поле
FullName - текстовый тип (синтаксис
SQL требует, чтобы текстовые
значения всегда были обрамлены одинарными кавычками).
Для того чтобы задать маску, в примере использовался символ '%',
который в SQL - запросах соответствует
произвольной последовательности символов. Также для определения
маски может использоваться символ '_'
(подчерк), соответствующий одному
произвольному символу.
Вывод результата выполнения запроса в виде таблицы
Теги DBTABLE и DBCOL
всегда употребляются вместе для отображения результата выполнения
запроса в виде таблицы.
Атрибуты тега DBTABLE:
QUERY | - имя DBQUERY, для которого нужно отобразить данные; |
MAXROWS | - максимальное количество записей, которое может быть отображено в таблице; |
COLSPACING | - количество пробелов, которые будут вставлены между колонками (по умолчанию 2); |
HEADERLINES | - количество строк, которые будут отведены для заголовка (по умолчанию 2); |
HTMLTABLE | - при наличие этого тега результат запроса будет отображен в виде HTML - таблицы, в противном случае будет использован тег HTML <PRE>. |
BORDER | - используетя только вместе с атрибутом HTMLTABLE для отображения рамки в таблице. |
Атрибуты тега DBTABLE:
HEADER | - текст, который будет выводиться как заголовок колонки; |
WIDTH | - ширина колонки в символах (по умолчанию 20); |
ALIGN | -выравнивание содержимого колонки (LEFT, RIGHT и CENTER); |
TEXT | -заключенный в кавычки текст, определяющий содержимое колонки, в котором могут находиться те же теги, ссылки на параметры и др., что и в теге DBOUTPUT. |
Приведем пример использования тегов DBTABLE
и DBCOL:
<DBTABLE QUERY "AllPersons"
MAXROWS=20>
<DBCOL HEADER="Фамилия
Имя Отчество" WIDTH="30" TEXT="#FullName#">
<DBCOL HEADER="Телефон"
WIDTH="10" TEXT="#Phone#">
<DBCOL HEADER="Дата рождения"
WIDTH="9" TEXT="# DateFormat(Birthday)#">
</DBTABLE>
Вызов метода
Существует два способа обратиться к методу. Во-первых, можно вызвать его просто
как подпрограмму. Но в таком случае не работает механизм наследования. Второй способ
лучше просто проиллюстрировать примерами.
$fred = find Critter "Fred";
display $fred, 'Height', 'Weight';
Это можно записать так:
display {find Critter "Fred"} 'Height', 'Weight';
Взаимодействие Cold Fusion с базами данных
Cold Fusion позволяет динамически
генерировать HTML документы
основанные на запросах пользователя. Эти запросы передаются в
Cold Fusion CGI - скрипт (DBML.EXE),
который пересылает данные в Cold
Fusion Engine обрабатывающий эти данные в соответствии
с заданным шаблоном, выполняя необходимые запросы и генерируя
HTML документ, который отправляется
пользователю.
Основой динамического создания документов являются специальные
теги, входящие в язык разметки DBML,
ориентированные на работу с базами данных.
Почти все основные возможности Cold
Fusion сосредоточены в четырех тегах:
DBQUERY - выполнение SQL
- запроса к базе данных;
DBINSERT & DBUPDATE - создание
и модификация записей в базе данных;
DBOUTPUT - отображение
результата запроса, допускающее его произвольное размещение среди
HTML - тегов.
Шаблон, на основе которого генерируется HTML
- документ, представляет собой комбинацию тегов
HTML и DBML:
HTML - теги используются
для форматирования как постоянной части документа, так и результатов
запросов. Например, можно определить полужирный шрифт для каждого
поля и разделительные линии между записями.
DBML - теги используются
для формирования запроса к базе данных, а также определяют где
и как будут отображены результаты запросов.
На рисунке 5-1 показывается, как Cold
Fusion обрабатывает запрос, полученный от клиента:
Рисунок 5-1
Когда пользователь нажимает кнопку типа "Submit"
в форме или выбирает гипертекстную ссылку в документе,
Web - браузер отправляет запрос
на Web - сервер.
Web - сервер, если в запросе
указан DBML - шаблон, запускает
процесс Cold Fusion, отправляя
ему данные полученные от клиента.
Cold Fusion принимает
данные полученные от клиента обрабатывает теги DBML
в шаблоне, включая подготовку запроса к базе данных и форматирование,
которое будет использоваться в результирующем документе.
Cold Fusion взаимодействует
с базой данных используя ODBC.
Cold Fusion динамически
генерирует HTML - документ
содержащий результат выполнения запросов к базе данных и возвращает
его Web - серверу. Cold
Fusion может также динамически генерировать почтовое сообщение
и отправлять его через почтовый SMTP
- сервер.
Web - сервер возвращает
сгенерированный HTML - документ
Web - клиенту.
Взаимодействие с СУБД
Perl позволяет осуществлять доступ к различным СУБД. Здесь будет освещен вопрос
доступа к СУБД Oracle.
WWW и анимация
Существует несколько способов ``оживления'' WWW-документов с помощью анимации,
из которых наиболее употребительными являются так называемые ``анимированные GIF-
файлы'' и программы на языке Java.
Спецификация формата GIF от 1989-го года позволяет хранить в одном файле
несколько изображений и задавать порядок их отображения. На этом свойстве
строится механизм, называемый ``animated-GIFs'', позволяющий ``оживить''
статические WWW-страницы. Последние версии таких браузеров, как Netscape
Navigator и Microsoft Internet Explorer корректно отображают анимированные
GIF-файлы. Фирмы-производители этих браузеров даже предоставляют небольшие
анимированные рекламные изображения для тех, кто желает отметить на своих
страницах, что они оптимизированы для просмотра в их браузерах.
Для создания анимированных GIF-файлов на платформе MS Windows можно
применять ранее упоминавшуюся программу Gif Construction Set for Windows.
Последние версии многих иллюстративных пакетов (например, CorelXARA) имеют
встроенные возможности для создания анимаций в GIF-файлах.
WWW - сервер NCSA HTTPD
Как было сказано ранее, одним из ключевых элементов технологии WWW
является WWW-сервер. Стандартом де-факто для Unix-систем стало программное обеспечение (ПО) WWW-сервера
Национального Центра по Суперкомпьютерным Приложениям (NCSA) Иллинойского Университета. Все вновь создаваемые продукты поддерживают полную совместимость
с ПО NCSA по режимам работы и форматом данных. Cервер NCSA является постоянно совершенствуемым
продуктом, отражающим последние веяния WWW-технологии.
Созданная относительно недавно "Apache Group" разрабатывает свое программное обеспечение
WWW - сервера на базе продукта NCSA HTTPD.
Глава данного отчета посвящена установке и администрированию
WWW-сервера NCSA HTTPD.
WWW (World Wide Web) и средства интерактивного взаимодействия
Цель данной главы познакомить пользователя с той частью WWW-технологий
которая связана с созданием интерактивных интерфейсов и предполагается
что пользователь знаком с основами WWW, HTML и С/С++.
В общем случае, интерактивный интерфейс пользователя представляет собой систему, обеспечивающую взаимодействие пользователя и программы.
Для WWW, интерактивный интерфейс можно определить как последовательность HTML-документов, реализующих
интерфейс пользователя. Можно также условно классифицировать принципы построения интерфейса по типу формирования HTML-документа:
статический
динамический
В первом случае источником интерфейса является HTML-документ, созданный в каком-либо текстовом или HTML-ориентированном редакторе.
Следовательно, данный документ остается неизменным в течение использования. Во втором случае источником интерфейса является HTML-документ
сгенерированный cgi-модулем. Следовательно, появляется некоторая гибкость в видоизменении интерфейса во время использования.
Таким образом, можно ввести понятие интерактивного интерфейса
для WWW.
Интерактивный интерфейс для WWW представляет собой последовательность статических или динамически формируемых HTML-документов,
реализующих интерфейс пользователя.
Практически любая задача, решающая проблему получения данных от клиента, связана с построением интерфейса. Наиболее интересным
является построение интерфейсов к различным базам данных, доступ к SQL-серверу, получение информации от периферийных устройств, создание клиентских рабочих мест. Все это возможно посредством
CGI(Common Gateway Interface).
Common Gateway Interface (CGI)
является стандартом интерфейса внешней прикладной программы с
WWW сервером.
Задача построения вышеназванных интерфейсов делится на две части:
Клиентская часть
Серверная часть
Рисунок 4-1. Две части интерактивного интерфейса.
Заглавные теги
Начиная писать HTML-документ, имеет смысл идентифицировать его как
таковой. Такая идентификация достигается путем вставления в самое начало
документа тегов <!DOCTYPE HTML PUBLIC ``-//W3C//DTD HTML 3.2//EN''> и
<HTML> (соответственно, в конец документа, закрывающего тега </HTML>; никогда не забывайте закрывать скобки!).
Тег DOCTYPE является тегом языка SGML и объявляет, что документ будет
описан в соответствии со спецификацией HTML 3.2. Тег HTML указывает на начало
документа. Теперь пора подумать об информационном наполнении. Начнем, естественно, с заголовка.
Заголовок HTML-файла находится в обязательной секции <HEAD>,
которая должна находиться в самом начале, то есть сразу после тега <HTML>. Оформляется заголовок с помощью
тега <TITLE>. Назовем наш документ ``The first homepage''. Ниже приведен листинг получившегося HTML-документа:
<HTML>
<HEAD>
<TITLE>The first homepage</TITLE>
</HEAD>
</HTML>
Попробуем просмотреть этот файл с помощью какой-нибудь программы просмотра,
например, Navigator фирмы Netscape Communications Corp. После загрузки
экран программы остался пустым. ``А где же заголовок?'',- спросит возмущенный
читатель. Присмотритесь повнимательней к ЗАГОЛОВКУ ОКНА программы просмотра
в оконной системе и убедитесь, что заголовок отображен именно там. Тег <TITLE>
позволяет задавать название для всего документа.
Это название будет появляться в заголовке окна программы просмотра, а
также будет появляться в списке закладок (bookmarks, shortcuts в различных
терминологиях) при создании таковых.
Другими элементами секции <HEAD>...</HEAD> являются:
<BASE параметры> - тег для указания URL документа. Тег имеет такие параметры:
HREF - указывает базовый URL
для документа. Замечание: URL должен быть указан в полной форме.
TARGET - указывает окно для отображения документов, на которые ссылается данный документ.
<STYLE> - тег, зарезервированный для использования в будущем для
так называемых ``стилей'' (stylesheets). Точный синтаксис тега пока
недокументирован.
<META параметры> - тег, который теоретически должен использоваться для включения в документ некой специфичной информации для программ-индексаторов,
каталогизаторов и т.д. Кроме того, у него есть несколько
полезных параметров, позволяющих страницам сменять друг друга по прошествии
определенных промежутков времени.
Тег имеет следующие параметры:
HTTP-EQUIV=``refresh'' - указывает программе просмотра, что нужно перепрыгнуть на страничку, указанную в параметре CONTENT по прошествии указанного там же промежутка времени.
CONTENT=``number; url=URL'' - задает временной интервал number и URL для команды HTTP-EQUIV=``refresh''.
NAME=``description'' или NAME=``keywords'' - указывает серверу, как интерпретировать параметр CONTENT - как описание документа или как список ключевых слов.
CONTENT=``text или список значений'' - это не опечатка. У параметра CONTENT два смысла: один для команды HTTP-EQUIV=``refresh'', другой для команды NAME. В последнем случае значение параметра определяет либо описание документа (если параметр NAME=``description''), либо список разделенных запятыми ключевых слов (если параметр NAME=``keywords'').
Теперь перейдем к оформлению содержимого документа. В терминах HTML содержимое документа называется его ТЕЛОМ, или по-английски - BODY. Именно так и называется
тег, в поле действия которого находится все содержимое (то есть, оно заключено между внутри тега <BODY>...</BODY>). Тег <BODY>...</BODY> может
содержать дополнительные параметры, позволяющие изменить цвета,
используемые в документе или назначить фоновую картинку:
BGCOLOR - определяет цвет фона документа. Цвет может быть задан как RGB-триплет (см. Приложение П1 к отчету) (например, BGCOLOR="#FFFFFF"--белый цвет), или быть одним из предопределенных символьных имен:
aquablackbluefuchsia
gray green lome maroon
navy olive purple red
silver teal white yellow
BACKGROUND - позволяет задать фоновую картинку для документа.Картинка будет размножена (tiled) и покроет всю видимую площадь области отображения окна программы просмотра.
TEXT - задает цвет текста документа. Цвет задается так же как и для параметра BGCOLOR.
LINK - задает цвет для текста и рамок изображений в активных зонах документа, содержащих ссылки (anchors).
VLINK - (Visited LINKs color) задает цвет для ранее выбранных ссылок.
ALINK - (Active LINKs color) задает цвет для ссылок в момент выбора.
Заголовки
Если посмотреть на получившуюся к этому моменту страницу, то она
покажется однотонной и малопривлекательной. С первого взгляда даже
непонятно, о чем она (если не смотреть на заголовок окна). Странице не
хватает ``настоящего'' заголовка, то есть, заголовка в теле самого
документа. HTML различает шесть различных видов заголовков. Для
их создания используются теги <H1>...</H1>,...,<H6>...</H6>.
Название тегов происходит от английского слова Heading (то есть,
заголовок) что определяет их использование. Размер 1 соответствует
самому крупному шрифту, размер 6 самому мелкому. Итак, озаглавим нашу
страницу, напишем перед основным текстом строчку
<H1>Welcome to my homepage!</H1>
Теперь просмотрим нашу страницу в браузере. Теперь страница смотрится
гораздо лучше чем раньше. Теги <Hn> являются блочными: в месте их применения происходит
разрыв абзацев.
Занесение и модификация данных с использованием тегов DBINSERT и DBUPDATE
При использовании тегов DBINSERT и DBUPDATE для занесения
или модификации данных, параметры должны быть переданы в шаблон
обязательно из формы, используя метод POST.
Для создания новой записи в базе данных используется тег DBINSERT,
а для модификации существующей записи используется тег DBUPDATE.
При использовании этих тегов необходимо определить атрибуты DATASOURCE
и TABLENAME. DATASOURCE это название источника данных ODBC,
содержащего редактируемую таблицу, а TABLENAME - имя этой таблицы.
Например, если источник данных ODBC
называется 'Person DB', а
таблица, в которой требуется создать запись - 'Person',
то тег DBINSERT в шаблоне
будет иметь следующий вид:
<DBINSERT DATASOURCE="Person
DB" TABLENAME="Person">
Параметры, переданные в шаблон должны совпадать с именами полей
таблицы, в которой создается (модифицируется) запись. В том случае,
если не все передаваемые параметры должны участвовать в этой процедуре,
используется атрибут FORMFIELDS,
в котором через запятую перечисляются имена полей таблицы, для
которых должны существовать одноименные параметры.
Особо следует отметить, что для того, чтобы использовать тег DBUPDATE
для модификации записи, в таблице должен быть определен
первичный ключ, а для всех полей включенных в первичный ключ из
обрабатываемой HTML-формы
обязательно должны быть переданы соответствующие параметры.
Теги DBINSERT и DBUPDATE
могут иметь также еще два необязательных атрибута:
TABLEOWNER - для тех источников
данных которые поддерживают права собственности на таблицы (например,
SQL Server, Oracle и др.),
этот атрибут можно использовать, чтобы указать собственника таблицы.
TABLEQUALIFIER - для различных
источников данных этот атрибут может иметь разный смысл. Так,
для SQL Server и Oracle
- это имя базы данных, в которой содержится таблица, а
для Intersolv dBase - это
директория в которой расположены DBF
файлы.
Пример
Пусть определена HTML -
форма для ввода данных:
<HTML>
<HEAD>
<TITLE>Пример ввода данных
для создания записи</TITLE>
</HEAD>
<BODY>
<FORM ACTION="/cgi-shl/dbml.exe?Template=example.dbm"
METHOD="POST">
ФИО : <INPUT TYPE="Text"
NAME="FullName">
Телефон : <INPUT TYPE="Text"
NAME="Phone">
Дата рождения : <INPUT TYPE="Text"
NAME="Birthday">
</FORM>
</BODY>
</HTML>
Следующий шаблон, example.dbm,
которому будут переданы данные из формы создает запись в таблице
и выдает подтверждающее сообщение:
<DBINSERT DATASOURCE="Person
DB" TableName="Persons"
FORMFIELDS="FullName,Phone,Birthday">
<HTML>
<HEAD><TITLE>Подтверждение</TITLE></HEAD>
<BODY>
<H1>Запись создана!</H1>
</BODY>
</HTML>
Зарезервированные переменные
В Perl есть имена имеющие специальное значение. Многие из них аналогичны
зарезервированным именам в shell.
Если вы хотите использовать длинные имена
переменных, в заголовке программы требуется сказать:
use English;
Многие переменные доступны только для чтения, то есть при попытке присвоения
такой переменной какого-либо значения напрямую или по ссылке происходит ошибка.
$_
В эту переменную по умолчанию происходит ввод, присваивание, в нее
складываются результаты поиска по заданному образцу.
while(<>){...}
или, что то же самое:
while($_= <>) {...}
$<digit>
Эта переменная была описана в предыдущем параграфе. Она
доступна только для чтения, так же как и переменные $&, $`, $' и $+.
$.
Эта переменная содержит номер строки, которая была почитана
последней из файла, который был прочитан последним. Она также доступна только
для чтения.
$/
Содержит символ по которому разделяются вводимые записи. По умолчанию
содержит символ перевода строки. Она похожа на переменную RS из awk.
$|
По умолчанию имеет значение 0. Если содержит ненулевое значение,
то происходит сброс буферов каждый раз после осуществления вывода
(на печать, на экран и т.д.).
$,
Содержит символ-разделитель полей для оператора печати. Подобна
переменной OFS в awk.
$
Содержит символ-разделитель записей для оператора печати.
Подобна переменной ORS в awk. (Вы можете определить $ вместо того,
чтобы печатать n в конце печати.)
$"
Подобна переменной $,. Но используется при обращении к списку величин
в двойных кавычках (или другой строке, которая требует интерпретации). По
умолчанию содержит символ пробел.
$;
Содержит символ-разделитель для эмуляции многомерных хэшей. Если
ссылаться на такой элемент хэша как $foo{$a,$b,$c} то реально это будет
происходить так: $foo{join($;,$a,$b,$c)}. Не путайте с @foo{$a,$b,$c},
так как это тоже самое, что($foo{$a},$foo{$b},$foo{$c}). По умолчанию
содержит значение \034 такое же как переменная SUBSEP в awk.
$#
Формат для печати чисел.
Подобна переменной OFMT в awk. Первоначально
содержит значение %.20g.
$%
Содержит номер текущей выводимой страницы.
$=
Содержит длину текущей страницы (количество печатных срок), обычно
содержит значение 60.
$-
Содержит значение, определяющее количество оставшихся на странице строк,
например количество еще не напечатанных строк для печатного канала вывода.
$~
Содержит имя текущего формата сообщений. Обычно имя дескриптора файла.
$^
Содержит имя текущего формата заголовка страницы. Обычно содержит имя
дескриптора файла с добавлением в конце _TOP
$:
Содержит множество символов после которых вывод сроки может быть
прерван и начат снова после перевода строки.
$!
Если эта переменная используется в числовом контексте, то содержит
текущее значение errno (номер ошибки) со всеми обычными сообщениями. В строковом
контексте содержит соответствующее системное сообщение об ошибке.
$@
Содержит сообщение о синтаксической ошибке, допущенной во время
исполнения последней команды eval(). Если содержит значение 0, то команда
была исполнена корректно. Но заметьте, что сообщения не накапливаются в этой
переменной.
$$
Содержит идентификатор текущего процесса.
$<
Содержит идентификатор пользователя (UID), которому принадлежит текущий
процесс.
$>
Содержит эффективный UID текущего процесса.
$(
Содержит идентификатор группы (GID) пользователя, которому принадлежит
текущий процесс.
$)
Содержит эффективный GID текущего процесса.
$0
Содержит имя файла, в котором находится исполняемая программа.
$ARGV
Содержит имя текущего файла, из которого происходит чтение.
@ARGV
Содержит массив аргументов командной строки, которые были переданы
программе.
@INC
Содержит список точек входа в программу, в которых используются
конструкции do EXPR, require и use.
%INC
Содержит входы для каждого файла, который включается посредством
использования операторов do или require. Ключами являются имена файлов, а значениями
места их расположения.
%ENV
Содержит текущее окружение процесса.Изменением содержимого
хэша можно изменить окружение порожденного (дочернего) процесса.
%SIG
Этот хэш используется для установки обработчиков различных
сигналов. Например:
sub handler {
local($sig) = @_;
print "Caught a SIG$sig - shutting down\n";
close(LOG);
exit(0);
}
$SIG{'INT'} = 'handler';
$SIG{'QUIT'} = 'handler';
...
$SIG{'INT'} = 'DEFAULT';
$SIG{'QUIT'} = 'IGNORE';