Данная статья написана для людей, которым в силу непреодолимых обстоятельств приспичило срочно изучить Перл. Для меня таким обстоятельством стало то, что мой компьютер стал WEB-сервером, а я, соответственно, WEB-мастером. Учиться принято на чужих ошибках и опыте, поэтому предлагаю Вашему вниманию свой опыт изучения Перла.
Сразу нужно пояснить, для кого это все написано. Если Ваш сервер работает на платформе UNIX, то это я должен читать Вашу статью. У меня же установлен Windows NT workstation 4.0 (RUS) плюс Service Pack 3. Когда пришло время сделать из компьютера WEB-сервер, я было кинулся ко встроенным Службам узла WEB, но быстро понял, что это мне не нравится (почему?). И тут один добрый человек посоветовал поставить Xitami WEB Server от iMatix Corporation (), который и стоит по сей день.
Что касается самого Перла, то здесь несколько сложнее. Покопавшись по различным Перловым серверам (www.perl.org , www.perl.com) я узнал, что версий Перла настолько много, что выбрать что-нибудь конкретное довольно сложно. При этом каких-нибудь вразумительных рекомендаций по поводу выбора той или иной версии нигде нет. Перепробовав почти все версии для Windows, я остановил свой выбор на Active Perl ().
Человеку, избалованному всякими Виндовозами и Дельфями, писать программы на Перл довольно непривычно, поэтому настоятельно рекомендую сразу установить Perl Builder. Взять его можно на www.solutionsoft.com. Там лежала тридцатидневная Демо версия.
Ну, думаю, пора переходить непосредственно к делу. В общем случае, скрипт на Перл, как и любая другая программа, работает так:
- получает данные
- обрабатывает данные
- выдает результаты
Передать данные скрипту можно двумя методами - GET и POST. Разница между ними в том, что при использовании GET данные постоянно болтаются в строке адреса браузера, напимер:
Httр://treagraf.tasur.edu.ru/cgi-bin/price.pl?Category=POWER&Description=varta
В этом случае скрипт B_price.pl берет данные в переменной окружения QUERY-STRING.
$data=$ENV{"QUERY_STRING"};
При использовании метода POST данные передаются на стандартный вход скрипта. Длинна блока данных берется в переменной CONTENT_LENGTH:
Read(STDIN,$data,$ENV{"CONTENT_LENGTH"});
Теперь эти данные нужно перевести в удобоваримый вид, поскольку они закодированы.
Стандартным соглашением служит замена пробелов знаками плюс и затем кодировка оставшихся недопустимых символов с помощью ASCII-кодов в шестнадцатиричной форме, перед которыми ставится знак (%). Пример:
Http://treagraf.tasur.edu.ru/cgi-bin/B_price.pl\ ?Category=%C2%E8%E4%E5%EE&Description=%E0%E1%E2%E3
Это значит:
Http://treagraf.tasur.edu.ru/cgi-bin/B_price.pl?\ Category=Видео&Description=абвг
Декодировать строку запросов в первый раз лучше самому. На вопрос "а как?" есть множество ответов, переписывать которые нет смысла. Приведу лишь короткий пример:
Заменяем знаки (+) на пробелы
$query = ~ s/\+/ /g;
Потом заменяем все сочетания знака (%), после которого следуют шестнадцатиричные цифры, на соответствующий символ ASCII
$query =~ s/%({2})/pack("C", hex($1))/eg;
Я пользуюсь тем, что предлагает Perl Builder:
#! E:\perl5\bin\perl &GetFormInput; # вызов подпрограммы получения данных $Category = $field{"Category"}; # получаем данные из поля Category $Description = $field{"Description"}; # получаем данные из поля Description $Page = $field{"Page"}; # получаем данные из поля Page
В конце скрипта помещаем подпрограмму "прозрачного" чтения данных.
Sub GetFormInput { (*fval) = @_ if @_ ; local ($buf); if ($ENV{"REQUEST_METHOD"} eq "POST") { read(STDIN,$buf,$ENV{"CONTENT_LENGTH"}); } else { $buf=$ENV{"QUERY_STRING"}; } if ($buf eq "") {return 0;} else { @fval=split(/&/,$buf); foreach $i (0 .. $#fval){ ($name,$val)=split (/=/,$fval[$i],2); $val=~tr/+/ /; $val=~ s/%(..)/pack("c",hex($1))/ge; $name=~tr/+/ /; $name=~ s/%(..)/pack("c",hex($1))/ge; if (!defined($field{$name})) { $field{$name}=$val; } else { $field{$name} .= ",$val"; #if you want multi-selects to goto into an array change to: #$field{$name} .= "\0$val"; } } } return 1; }
Второй этап работы скрипта - обработка данных - полностью на Ваше усмотрение. Проверяйте полученные данные на правильность, пишите их в файл, делайте что хотите.
И, наконец, Вам нужно выдать какие-то результаты броузеру клиента, причем так, чтобы броузер правильно их отобразил. То есть, выдавать результаты нужно в HTML. Это делается просто: (тоже можно по-разному)
Print "Content-type: text/html", "/n/n"; #обязательная строка print "
В поле Category Вы ввели: ", $Category, "
Все это касается скриптов, получающих данные из формы на странице HTML. При этом страница с формой - отдельно, скрипт - отдельно. Можно сделать красивее и удобнее: объединить страницу и скрипт в единое целое. Для этого скрипт пишется по схеме:
- При первом запуске скрипт рисует HTML страницу с формой и ссылкой в тэге ACTION на самого себя. Первый запуск определяется по отсутствию входных данных.
- Если входные данные есть, то получаем их, обрабатываем и выдаем результаты.
#! E:\perl5\bin\perl if (($ENV{"QUERY_STRING"} eq "") or ($ENV{CONTENT_LENGTH}=0)) { # генерируем страницу с формой } else {# получаем данные, обрабатываем и выдаем результат}
Гостевая книга
Общий алгоритм работы гостевой книги таков:
1. Если посетитель хочет сделать запись в книгу, то
1.1 Получаем данные
1.2 Записываем их в файл или в базу данных
1.3 Говорим спасибо на HTML и предлагаем почитать другие записи
2. Если посетитель хочет почитать записи в книге, то
2.1 Читаем записи из файла или из базы данных
2.2 Выводим их красиво в HTML
Для удобства восприятия я оформил пункты 1 и 2 отдельными скриптами add_guestbook.pl и read_guestbook.pl соответственно. Сообщения гостевой книги хранятся в текстовом файле построчно, т.е. на каждую запись - строка. Так сделано для удобства чтения этого файла. Пример одной записи:
Sat Dec 5 13:31:20 1998&Наташа&студентка&Good&Для начала хорошо. Успехов на данном поприще Вам, Александр!&нету@пока&194.226.60.34
Вот описание полей рассматриваемой гостевой книги.
- Name - имя, фамилия, отчество, кличка - на усмотрение посетителя
- Work - профессия, род занятий
- RadioButton - три кнопки: понравилось (Good), не понравилось (Bad), пофигу (Different)
- Text - text box комментариев и примечаний
- Email - обратный адрес
О днако наиболее широко применяемым языком для написания скриптов является Perl.
Э та глава посвящена языку Perl и его использованию. После того как вы научитесь программировать, используя Perl, вы сможете использовать его для написания скриптов, с помощью которых решаются разнообразные задачи программирования для Internet и Web.
О собый упор будет сделан на тех особенностях, которые используются при написании CGI-скриптов. Если вы никогда не программировали ранее на языке Perl, используйте эту главу как отправную точку в его освоении.
К онцепции, с которыми вы познакомитесь в этой главе, научат, как писать профессиональные скрипты на языке Perl.
В главе рассматриваются не только основы программирования на Perl, но также и несколько других аспектов. К моменту окончания чтения главы вы будете в состоянии усвоить следующие ключевые концепции: Perl является интерпретируемым языком программирования, специально ориентированным на обработку текста.
П рограммисты часто называют программы на языке Perl скриптами. Используя Perl,программисты создают CGI-формы.
P erl поддерживает операции с файлами и с базами данных. Это делает его хорошо приспособленным для хранения и извлечения информации в соответствии с потребностями пользователей Web.
P
erl снабжается отладочной программой, с помощью которой вы тестируете код Perl
В этом разделе:
8
Язык программирования PERL
Эта статья введет вас в курс посвященный языку Perl, даст сравнительную характеристику Perl и C/C++, расскажет о богатстве Perl.
8
Использование PERL
Принципы использования Perl, или что можно сделать при помощи Perl.
8
Знакомство с языком PERL
Основные понятия языка Perl, первый пример.
8
Установка PERL
Легкий намек на то, как становить Perl.
8
Использование отладчика PERL
Основные принципы работы с отладчиком Perl; команды отладчика; примеры использования.
8
Типы данных в PERL
Глава посвященна типам данных и переходу от одного типа к другому
8
Переменные
Perl поддерживает три типа переменных: скаляры, массивы и ассоциативные массивы. О них и речь. ;-)
8
Операторы PERL
Обзор основных операторов Perl.
8
Конструкции языка PERL
Описание особенностей синтаксиса Perl. Основные операторы.
8
Подпрограммы
Синтаксис и семантика подпрограмм в Perl.
8
Обработка строк
Описание функций для обработки строковых переменных.
8
Обработка списков
Несколько функций, которые расширяют набор возможностей для работы со списками.
8
Работа с массивами
Perl содержит несколько встроенных функций, которые помогают работать с элементами массива.
8
CGI-скрипты при помощи PERL
В этой главе вы научитесь использовать Perl для создания скриптов CGI.
Данная статья написана для людей, которым в силу непреодолимых обстоятельств приспичило срочно изучить Перл. Для меня таким обстоятельством стало то, что мой компьютер стал WEB-сервером, а я, соответственно, WEB-мастером. Учиться принято на чужих ошибках и опыте, поэтому предлагаю Вашему вниманию свой опыт изучения Перла.
Сразу нужно пояснить, для кого это все написано. Если Ваш сервер работает на платформе UNIX, то это я должен читать Вашу статью. У меня же установлен Windows NT workstation 4.0 (RUS) плюс Service Pack 3. Когда пришло время сделать из компьютера WEB-сервер, я было кинулся ко встроенным Службам узла WEB, но быстро понял, что это мне не нравится (почему?). И тут один добрый человек посоветовал поставить Xitami WEB Server от iMatix Corporation (http://www.imatix.com/), который и стоит по сей день.
Что касается самого Перла, то здесь несколько сложнее. Покопавшись по различным Перловым серверам (www.perl.org , www.perl.com) я узнал, что версий Перла настолько много, что выбрать что-нибудь конкретное довольно сложно. При этом каких-нибудь вразумительных рекомендаций по поводу выбора той или иной версии нигде нет. Перепробовав почти все версии для Windows, я остановил свой выбор на Active Perl (http://www.activestate.com/).
Человеку, избалованному всякими Виндовозами и Дельфями, писать программы на Перл довольно непривычно, поэтому настоятельно рекомендую сразу установить Perl Builder. Взять его можно на www.solutionsoft.com. Там лежала тридцатидневная Демо версия.
Ну, думаю, пора переходить непосредственно к делу. В общем случае, скрипт на Перл, как и любая другая программа, работает так:
- получает данные
- обрабатывает данные
- выдает результаты
Передать данные скрипту можно двумя методами - GET и POST. Разница между ними в том, что при использовании GET данные постоянно болтаются в строке адреса браузера, напимер:
Httр://treagraf.tasur.edu.ru/cgi-bin/price.pl?Category=POWER&Description=varta
В этом случае скрипт B_price.pl берет данные в переменной окружения QUERY-STRING.
$data=$ENV{"QUERY_STRING"};
При использовании метода POST данные передаются на стандартный вход скрипта. Длинна блока данных берется в переменной CONTENT_LENGTH:
Read(STDIN,$data,$ENV{"CONTENT_LENGTH"});
Теперь эти данные нужно перевести в удобоваримый вид, поскольку они закодированы.
Стандартным соглашением служит замена пробелов знаками плюс и затем кодировка оставшихся недопустимых символов с помощью ASCII-кодов в шестнадцатиричной форме, перед которыми ставится знак (%). Пример:
Http://treagraf.tasur.edu.ru/cgi-bin/B_price.pl?Category=%C2%E8%E4%E5%EE&Description=%E0%E1%E2%E3
Это значит:
Http://treagraf.tasur.edu.ru/cgi-bin/B_price.pl?Category=Видео&Description=абвг
Декодировать строку запросов в первый раз лучше самому. На вопрос "а как?" есть множество ответов, переписывать которые нет смысла. Приведу лишь короткий пример:
Заменяем знаки (+) на пробелы
$query = ~ s/\+/ /g;
Потом заменяем все сочетания знака (%), после которого следуют шестнадцатиричные цифры, на соответствующий символ ASCII
$query =~ s/%({2})/pack("C", hex($1))/eg;
Я пользуюсь тем, что предлагает Perl Builder:
#! E:\perl5\bin\perl &GetFormInput; # вызов подпрограммы получения данных $Category = $field{"Category"}; # получаем данные из поля Category $Description = $field{"Description"}; # получаем данные из поля Description $Page = $field{"Page"}; # получаем данные из поля Page
В конце скрипта помещаем подпрограмму "прозрачного" чтения данных.
Sub GetFormInput { (*fval) = @_ if @_ ; local ($buf); if ($ENV{"REQUEST_METHOD"} eq "POST") { read(STDIN,$buf,$ENV{"CONTENT_LENGTH"}); } else { $buf=$ENV{"QUERY_STRING"}; } if ($buf eq "") { return 0 ; } else { @fval=split(/&/,$buf); foreach $i (0 .. $#fval){ ($name,$val)=split (/=/,$fval[$i],2); $val=~tr/+/ /; $val=~ s/%(..)/pack("c",hex($1))/ge; $name=~tr/+/ /; $name=~ s/%(..)/pack("c",hex($1))/ge; if (!defined($field{$name})) { $field{$name}=$val; } else { $field{$name} .= ",$val"; #if you want multi-selects to goto into an array change to: #$field{$name} .= "\0$val"; } } } return 1; }
Второй этап работы скрипта - обработка данных - полностью на Ваше усмотрение. Проверяйте полученные данные на правильность, пишите их в файл, делайте что хотите.
И, наконец, Вам нужно выдать какие-то результаты броузеру клиента, причем так, чтобы броузер правильно их отобразил. То есть, выдавать результаты нужно в HTML. Это делается просто: (тоже можно по-разному)
Print "Content-type: text/html", "/n/n"; #обязательная строка print "
В поле Category Вы ввели: ", $Category, "
Все это касается скриптов, получающих данные из формы на странице HTML. При этом страница с формой - отдельно, скрипт - отдельно. Можно сделать красивее и удобнее: объединить страницу и скрипт в единое целое. Для этого скрипт пишется по схеме:
- При первом запуске скрипт рисует HTML страницу с формой и ссылкой в тэге ACTION на самого себя. Первый запуск определяется по отсутствию входных данных.
- Если входные данные есть, то получаем их, обрабатываем и выдаем результаты.
#! E:\perl5\bin\perl if (($ENV{"QUERY_STRING"} eq "") or ($ENV{CONTENT_LENGTH}=0)) { # генерируем страницу с формой } else {# получаем данные, обрабатываем и выдаем результат}
Гостевая книга |
---|
Общий алгоритм работы гостевой книги таков:
1. Если посетитель хочет сделать
запись в книгу, то
1.1 Получаем данные
1.2 Записываем их в файл или в базу данных
1.3 Говорим спасибо на HTML и предлагаем
почитать другие записи
2. Если посетитель хочет почитать записи в
книге, то
2.1 Читаем записи из файла или из базы данных
2.2 Выводим их красиво в HTML
Для удобства восприятия я оформил пункты 1 и 2 отдельными скриптами add_guestbook.pl и read_guestbook.pl соответственно. Сообщения гостевой книги хранятся в текстовом файле построчно, т.е. на каждую запись - строка. Так сделано для удобства чтения этого файла. Пример одной записи:
Sat Dec 5 13:31:20 1998&Наташа&студентка&Good&Для начала хорошо. Успехов на данном поприще Вам, Александр!&нету@пока&194.226.60.34
Вот описание полей
рассматриваемой гостевой книги.
Name - имя, фамилия, отчество, кличка - на
усмотрение посетителя
Work - профессия, род занятий
RadioButton - три кнопки: понравилось (Good), не
понравилось (Bad), пофигу (Different)
Text - text box комментариев и примечаний
Email - обратный адрес
add_guestbook.pl - запись в книгу
#! e:\perl5\perl # Первая строка, как обычно require "ssi-pl.pl"; # Я использую навигационную панель в виде SSI-включения. Для этого используется модуль ssi-pl.pl if (($ENV{"QUERY_STRING"} eq "") or ($ENV{CONTENT_LENGTH}=0)) { # Если нет входных данных, то генерируем страницу с формой print <
HTML DoInclude("_menu.htm"); # Это SSI-включение навигационной панели. print <
|
<
|
Вы не указали свое имя, E-mail, либо не заполнили сам текст Вашего отзыва. Вернитесь, пожалуйста, на страницу формы и заполните требуемые поля. Назад |
"."\n" ; print " | "; print " | "."\n" ;
print "
"."\n" ; DoInclude("D:/InetPub/wwwroot/_menu.htm"); print "
| "."\n" ;
print " "."\n" ; print " | Ваши данные"."\n" ; print " приняты. Спасибо. \n" ; print ""; print " | "."\n" ;
print "
"."\n" ; print " |
read_guestbook.pl - чтение книги
#! e:\perl5\perl # Первая строка, как обычно require "ssi-pl.pl"; # Я использую навигационную панель в виде SSI-включения. Для этого используется модуль ssi-pl.pl open(InFile, "guestbook.txt") || die; # Открываем файл с записями гостевой книги. @lines=HTML DoInclude("D:/InetPub/wwwroot/_menu.htm"); print <
|
Нам пишут:
Вам предстоит путешествие в мир программирования на языке Perl. Ваше путешествие будет тем более приятным из-за присутствия большого количества примеров, которые будут встречаться по ходу. Начало нашего путешествия охватывает основные концепции языка. Постепенно вы узнаете о Perl достаточно, чтобы создавать небольшие программы. В конце нашего путешествия вы уже будете обладать необходимым запасом знаний, чтобы уметь создавать полноценные приложения. Вы владеете какими-либо другими языками программирования? Если да, то изучение Perl будет для вас просто удовольствием. Если же нет, то не спешите, пробуйте все предлагаемые упражнения и примеры и не бойтесь экспериментировать! ПроисхождениеPerl появился в результате деятельности одного человека, и, по его собственному признанию, в результате его лени. Это - уникальный язык, суть которого невозможно передать простым описанием технических деталей. Perl - это состояние мышления. Одна из причуд языка - его название. Оно имеет несколько определений. Первоначально Perl означал Practical Extraction Report Language (практический язык извлечений и отчетов). Однако, программисты очень часто называют его Phatologically Eclectic Rubbish Lister или даже Practically Everything Really Likable. Давайте посвятим несколько минут тому, чтобы разобраться, что представляет собой Perl, и какие задачи возлагались на него во времена его создания. В далеком 1986 году Larry Wall работал над задачей генерирования отчетов из большого количества текстовых файлов, пересекающихся друг с другом. Будучи Unix-программистом, а также, потому что задача включала в себя манипулирование содержанием текстовых файлов, он первым делом попытался использовать Awk. Но вскоре стало ясно, что Awk для работы не подходит, и, не имея других кандидатов для решения поставленной задачи, оставалось только изобретать свой собственный инструмент, который можно было бы использовать и в будущем. Вместо того чтобы впустую тратить время, Larry просто изобрел новый язык программирования и написал интерпретатор для него. Это похоже на парадокс, но это не совсем так, - то, что вы делаете - это всегда большой труд, но если вы сделаете это правильно, то этот труд обязательно окупится. Вскоре Larry предложил свое детище сообществу читателей материалов телеконференций Usenet. Пользователи, имеющие доступ к Usenet, обеспечили создателю Perl эффективную "обратную поддержку", спрашивая, как делать одно, другое, третье. Многие из этих задач Larry даже и не собирался ставить перед своим маленьким новым языком программирования. Новый язык программирования имел акцент на управление системой и обработку текста. После нескольких пересмотров он уже мог использовать регулярные выражения, сигналы, а также сетевые сокеты. Он стал известен как Perl и очень быстро сделался популярным в среде Unix-программистов, а вскоре и у всех нас. Larry уже не сопровождает Perl в одиночку, но сохраняет свой эксклюзивный титул главного разработчика. Perl-программы очень похожи на Си-программы, - возможно, потому что Perl был написан на Си, а, возможно, потому что Larry нашел удобными некоторые конструкции Си. Но Perl менее педантичный и гораздо более лаконичный, чем Си. Perl призван помочь программисту в выполнении рутинных задач, которые для shell слишком трудны или плохо переносимы, а для Си (или любого другого языка) - слишком заумны или сложны в кодировании. Когда вы освоите Perl, вы, возможно, обнаружите, что стали тратить заметно меньше времени на правильное заключение в кавычки различных параметров shell (или на корректное выполнение Си-объявлений), а больше - на чтение Usenet-новостей и катание с гор на лыжах, потому что Perl - замечательное средство для вашего совершенствования как программиста. "Кто-то из древних" сказал: "Не стОит изучать язык программирования, который радикально не меняет вашего представления о программировании". Будьте уверены - изучив Perl, вы посмотрите на программирование с совершенно иной точки зрения. Мощные конструкции этого языка позволяют создавать с минимальной затратой сил очень эффективные решения и универсальные инструменты. Эти инструменты можно использовать и в дальнейшем, потому что написанные на Perl программы отличаются высокой переносимостью и готовностью к использованию. В результате у вас появится еще больше времени для чтения Usenet-новостей и посещения с друзьями баров. Perl очень хорошо умеет обращаться с задачами низкого уровня, особенно после выхода пятой версии языка. Стоимость и лицензияPerl свободен. Если быть более точным - Perl распространяется по открытой лицензии GNU (GNU Public License). Полный исходный код и документация абсолютно свободны для копирования, компилирования и печати. Все программы, написанные вами на Perl - ваши, и вы можете делать с ними все что захотите. Помимо UNIX-компьютеров, Perl также существует для других платформ, - Windows, DOS, Atari, Amiga и.д.
|