Практичний
Перл для початківця h2>
Дана робота
написана для людей, яким в силу непереборних обставин приспічило
терміново вивчити Перл. Для мене такою обставиною стало те, що мій комп'ютер
став WEB-сервером, а я, відповідно, WEB-майстром. Вчитися прийнято на чужих
помилках і досвіді, тому пропоную Вашій увазі свій досвід вивчення Перла. p>
Відразу потрібно
пояснити, для кого це все написано. Якщо Ваш сервер працює на платформі
UNIX, то це я повинен читати Вашу статтю. У мене ж встановлений Windows NT
workstation 4.0 (RUS) плюс
Service Pack 3. Коли прийшов
час зробити з комп'ютера WEB-сервер, я було кинувся до вбудованих Служб
вузла WEB, але швидко зрозумів, що це мені не подобається (чому?).
добра людина порадив поставити Xitami WEB Server від iMatix Corporation
(http://www.imatix.com/), який і стоїть донині. p>
Що стосується
самого Перла, то тут дещо складніше. Покопавшись з різних Перлових серверів
(www.perl.org, www.perl.com) я дізнався, що версій Перла настільки багато, що
вибрати що-небудь конкретне досить складно. При цьому яких-небудь
зрозумілих рекомендацій з приводу вибору тієї чи іншої версії ніде немає.
Перепробувавши майже всі версії для Windows, я зупинив свій вибір на Active
Perl (http://www.activestate.com/). P>
Людині,
розпещеному всякими Віндовозамі і Дельфи, писати програми на Перл досить
незвично, тому настійно рекомендую відразу встановити Perl Builder.
Взяти його можна на www.solutionsoft.com. Там лежала тридцятиденний Демо
версія. p>
Ну, думаю, пора
переходити безпосередньо до справи. У загальному випадку, скрипт на Перл, як і будь-яка
інша програма, працює так: p>
отримує дані
p>
обробляє
дані p>
видає
результати p>
Надіслати дані
скрипту можна двома методами - GET та POST. Різниця між ними в тому, що при
використанні GET дані постійно бовтаються в рядку адреси браузера, напімер:
p>
httр:// treagraf.tasur.edu.ru/cgi-bin/price.pl? Category = POWER & Description = varta p>
У цьому випадку
скрипт B_price.pl
бере дані в змінній оточення QUERY-STRING. p>
$ data = $ ENV ( 'QUERY_STRING'}; p>
При
використанні методу POST дані передаються на стандартний вхід скрипта. Довжина
блоку даних береться у змінній CONTENT_LENGTH: p>
read (STDIN, $ data, $ ENV ( 'CONTENT_LENGTH'}); p>
Тепер ці
дані потрібно перевести в легкотравний вигляд, оскільки вони закодовані. p>
Стандартним
угодою служить заміна пробілів знаками плюс і потім кодування, що залишилися
неприпустимих символів за допомогою ASCII-кодів у шістнадцятковій формі, перед
якими ставиться знак (%). Приклад: p>
http://treagraf.tasur.edu.ru/cgi-bin/B_price.pl?Category =% C2% E8% E4% E5% EE & Description =% E0% E1% E2% E3 p>
Це означає: p>
http://treagraf.tasur.edu.ru/cgi-bin/B_price.pl?Category=Видео&Description=абвг p>
декодувати
рядок запитів в перший раз краще самому. На питання "а як?" є
безліч відповідей, переписувати які немає сенсу. Наведу лише короткий
приклад: p>
Замінюємо знаки
(+) На прогалини p>
$ query = ~ s/+// g; p>
Потім замінюємо
всі поєднання знака (%), після якого слідують шістнадцяткові цифри, на
відповідний символ ASCII p>
$ query = ~ s /% ([0-9A-H] (2))/pack ( 'C', hex ($ 1))/eg; p>
Я користуюся
тим, що пропонує Perl Builder: p>
#! E: perl5binperl p>
& GetFormInput; # виклик підпрограми отримання даних p>
$ Category = $ field ( 'Category'); # отримуємо дані з поля Category p>
$ Description = $ field ( 'Description'); # отримуємо дані з поля Description p>
$ Page = $ field ( 'Page'); # отримуємо дані з поля Page p>
Наприкінці скрипта
поміщаємо підпрограму "прозорого" читання даних. p>
sub GetFormInput ( p>
(* fval) = @ _ if @ _; p>
local ($ buf); p>
if ($ ENV ( 'REQUEST_METHOD') eq 'POST') ( p>
read (STDIN, $ buf, $ ENV ( 'CONTENT_LENGTH')); p>
) p>
else ( p>
$ buf = $ ENV ( 'QUERY_STRING'); p>
) p>
if ($ buf eq "") ( p>
return 0; p>
) p>
else ( p>
@ fval = split (/&/,$ buf); p>
foreach $ i (0 .. $ # fval) ( p>
($ name, $ val) = split (/=/,$ fval [$ i], 2); p>
$ val = ~ tr/+//; p>
$ val = ~ s /%(..)/ pack ( "c", hex ($ 1))/ge; p>
$ name = ~ tr/+//; p>
$ name = ~ s /%(..)/ pack ( "c", hex ($ 1))/ge; p>
if (! defined ($ field ($ name))) ( p>
$ field ($ name) = $ val; p>
) p>
else ( p>
$ field ($ name) .= ", $ val"; p>
# if you want multi-selects to goto into an array
change to: p>
# $ field ($ name) .= "