Быстрый старт в Perl. Функции работы с массивами. Циклы for и foreach

Данная статья написана для людей, которым в силу непреодолимых обстоятельств приспичило срочно изучить Перл. Для меня таким обстоятельством стало то, что мой компьютер стал 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. Там лежала тридцатидневная Демо версия.

Ну, думаю, пора переходить непосредственно к делу. В общем случае, скрипт на Перл, как и любая другая программа, работает так:

  1. получает данные
  2. обрабатывает данные
  3. выдает результаты

Передать данные скрипту можно двумя методами - 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. При этом страница с формой - отдельно, скрипт - отдельно. Можно сделать красивее и удобнее: объединить страницу и скрипт в единое целое. Для этого скрипт пишется по схеме:

  1. При первом запуске скрипт рисует HTML страницу с формой и ссылкой в тэге ACTION на самого себя. Первый запуск определяется по отсутствию входных данных.
  2. Если входные данные есть, то получаем их, обрабатываем и выдаем результаты.

#! 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 <

Я, , по профессии простой , посетив данный сервер и ознакомившись с представленными на нем материалами, хочу выразить свои чувства и эмоции следующими приличными словами:

мне понравилось:-)

мне не понравилось:-(

мне пофигу:-|

В дополнение к сказанному хочу так же сказать:

Прошу принять к рассмотрению мое заявление и незамедлительно принять меры. Решение по моему заявлению направить письменно на мой электронный адрес .

HTML die; } # Теперь получаем входные данные. &GetFormInput; $Name = $field{"Name"} ; $Work = $field{"Work"} ; $RadioButton = $field{"RadioButton"} ; $Text = $field{"Text"} ; $Email = $field{"Email"} ; $Send = $field{"Send"} ; # это поле не используется # Проверяем, заполнены ли обязательные поля. # Если нет - генерируем HTML страницу с просьбой заполнить нужные поля. if ($Name eq "" || $Email eq "" || $Text eq "") { print < Книга жалоб и предложений - ошибка

<

Вы не указали свое имя, E-mail, либо не заполнили сам текст Вашего отзыва. Вернитесь, пожалуйста, на страницу формы и заполните требуемые поля.

Назад

HTML } else # все данные правильно введены { # Если все поля заполнены правильно, то начинаем их обрабатывать. $Text=~tr/\r\n/ /; #заменяем перевод строки на пробел # Если в текстовом поле формы (text box) посетитель нажимал Enter, # то нужно убрать символы перевода строки, чтобы можно было записать # все поля формы в одну строку файла. if ($Work eq "") {$Work=" "}; #если пусто - то пробел # Если поле не заполнено, то оно равно пробелу. $Name=~s/&/ /g; $Work=~s/&/ /g; $Text=~s/&/ /g; $Email=~s/&/ /g; # Если посетитель использовал символ &, то заменяем его на пробел, # поскольку этот символ мы будем использовать для разделения наших полей в файле. open(OutFile, ">>guestbook.txt") || die; # Открываем файл для добавления. $Time=localtime; #получаем время # Получаем время заполнения гостевой книги. $line=join("&", $Time, $Name, $Work, $RadioButton, $Text, $Email, $ENV{REMOTE_HOST}); # И, наконец, слепляем все поля формы в одну строку. На всякий случай добавляем в конце # IP адрес посетителя, взятый из переменных окружения. print OutFile "$line\n"; close OutFile; # Записываем полученную строку в файл и закрываем его. # Осталось только сказать посетителю спасибо. # выводим сообщение о успехе print "Content-type: text/html\n\n"; print "\n" ; print "\n" ; print "\n" ; print ""."\n" ; print ""."\n" ; print "Книга жалоб и предложений\n" ; print "\n" ; print "\n" ; print ""."\n" ; print "
"."\n" ; print "\n" ; print ""."\n" ; print " \n" ; print " "."\n" ; print " "."\n" ; print " \n" ; print "

"; print "

\n" ; print "
"."\n" ; print "\n" ; print ""."\n" ; print " \n" ; print " "."\n" ; print " "."\n" ; print " "."\n" ; print " \n" ; print "

"."\n" ; DoInclude("D:/InetPub/wwwroot/_menu.htm"); print "

Ваши данные"."\n" ; print " приняты. Спасибо.

\n" ; print "

"; print "

\n" ; print "
\n" ; print "\n" ; print "\n" ; print " \n" ; print " "."\n" ; print " \n" ; print "
\n" ; print "\n" ; print "\n" ; } # Не забываем подпрограмму разбора данных из формы. 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; }

read_guestbook.pl - чтение книги

#! e:\perl5\perl # Первая строка, как обычно require "ssi-pl.pl"; # Я использую навигационную панель в виде SSI-включения. Для этого используется модуль ssi-pl.pl open(InFile, "guestbook.txt") || die; # Открываем файл с записями гостевой книги. @lines=; # Читаем строки в массив. # Выдаем шапку HTML страницы. print < Книга жалоб и предложений - нам пишут

HTML DoInclude("D:/InetPub/wwwroot/_menu.htm"); print <

Нам пишут:

HTML # Теперь выводим записи в невидимой (в смысле, рамка не видима) таблице. # Чтобы свежие записи отображать первыми, обрабатываем массив строк с конца. for ($i=$#lines; $i>=$[; $i--) #обрабатываем строки файла с конца { # Разделяем строку на части @item=split("&", $lines[$i]); #разделяем на части # Теперь заменяем HTML тэги в записи (на случай какого-нибудь хитрого юзера) foreach (@item) { $_=~s//>/g; } # Приступаем непосредственно к выводу записей в HTML print "\n"; print "\n"; print "\n"; } # Осталось вывести окончание HTML print <
"."\n"; # В зависимости от поля, где посетителю предлагался выбор понравилось - не понравилось, # рисуем картинку с веселой или грустной мордочкой соответственно. В качестве ALT тэга # картинки пропишем IP адрес посетителя. print "
"." ".$item."
\n"; print "
".$item.", ".$item."
\n"; print "
".$item."
"."\n"; print "
".$item."
\n"; print "
\n"; print "
HTML close InFile; # Закрываем файл с записями гостевой книги.

Данная статья написана для людей, которым в силу непреодолимых обстоятельств приспичило срочно изучить Перл. Для меня таким обстоятельством стало то, что мой компьютер стал 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. Там лежала тридцатидневная Демо версия.

Ну, думаю, пора переходить непосредственно к делу. В общем случае, скрипт на Перл, как и любая другая программа, работает так:

  1. получает данные
  2. обрабатывает данные
  3. выдает результаты

Передать данные скрипту можно двумя методами - 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. При этом страница с формой - отдельно, скрипт - отдельно. Можно сделать красивее и удобнее: объединить страницу и скрипт в единое целое. Для этого скрипт пишется по схеме:

  1. При первом запуске скрипт рисует HTML страницу с формой и ссылкой в тэге ACTION на самого себя. Первый запуск определяется по отсутствию входных данных.
  2. Если входные данные есть, то получаем их, обрабатываем и выдаем результаты.

#! 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 - обратный адрес

FAQ по языку Perl для начинающих

Часто задаваемые вопросы, собранные в конференции RU.CGI.PERL.CHAINIK Что такое CGI? Это общий интерфейс шлюзов, связывающий программу, работющую под управлением вебсервера и клиента в виде HTTP-браузера. Иными словами, это средство, которое позволяет генерить HTML-документы "на лету", в зависимости от условий и пожеланий программиста. Как и любое клиент-серверное средство, CGI-программа состоит из двух частей - одной, которая работает на клиенте, в среде браузера, и другой, работающей на сервере, в среде вебсервера. Клиентская часть пишется на HTML (возможно, с употреблением раздичных дополнительных средств, расширяющих его возможности), серверная часть может быть на- писана на любом языке программирования, способном создавать выполняе- мые программы на платформе, на которой установлен вебсервер. Мы будем использовать для этих целей Перл, потому что он удобен для обработки текстовых строк - а HTML документ представляет собой именно текст. Принцип работы интерфейса очень прост - вебсервер, если ему это разрешено, может запустить выполняемую программу; в отличие от запуска этой же программы пользователем потоки вода, вывода и ошибок запущен- ной программы будут перенаправлены: ввода и вывода в протокол HTTP, а ошибок - в файл лога ошибок вебсервера. Таким образом, мы можем созда- вать HTML-документ "на лету", просто выводя в поток вывода его теги с помощию команды print или ее аналога. Впрочем, лучше один раз увидеть, чем сто раз услышать. Для того, чтобы работать с клиент-серверными пограммами, нужно сначала устано- вить клиент и сервер. В качестве клиента может быть использован любой браузер, поддерживающий протокол HTTP (рекомендуется Netscape, потому что он достаточно строго реагирует на ошибки; можно быть увереным, что то, что работает в нем будет работать где угодно - а обратное выполня- ется редко), в качестве сервера рекомендуется вебсервер Apache. Это один из самых распространенных вебсерверов, он может быть скомпилиро- ван полд все мыслимые платформы и ситемы, и отладженные под него прог- раммы скорее всего сможет установить любой провайдер. Вебсервер Apache для Windows лучше всего получить по адресу ftp://cdl.bmstu.ru/soft/cgi . Установите его, однако не в директорию, которую он предлагает для установки, а в c:\apache . Вебсервер может работать и в том случае, если он установлен в руть по-умолчанию, одна- ко при его настройке возникнут некоторые разночтения с предлагаемым здесь вариантом - если Вы хотите избегнуть нежелательных осложнений, измените путь по-умолчанию. Запустите вебсервер (на экране появится пустое черное окно - это нормальный результат успешного запуска; ни в коем случае не закрывайте это окно принудительно - для финиширования вебсервер создал Вам специ- альную иконку). Обратитесь к нему из браузера через URL http://localhost и убедитесь, что демонстрационная веб-страница, кото- рая находится в директори htdocs успешно запускается. Если вебсервер не удалось запустить, прочитайте выводимое им со- общение об ошибке. Чаще всего вебсервер не может запуститься из-за то- го, что не указано имя. Откройте на редактирование основной файл кон- фигурации вебсервера (httpd.conf) и снимите ремарку с пересенной Servername, присвоив серверу любое имя - например localhost. Теперь имеет смысл попробовать выполнить первую CGI-программу. Для того, чтобы иметь возможность писать CGI-программы на Перле, следует установить Перл. Взять его можно там же, где и вебсервер, ус- тановка этой программы не содержит особых подводных камней. Вам будет предложено скомпиллировать Перл из текста на Си, если Вы откажетесь от этого (что рекомендуется), будет развернута уже скомпилированная би- нарная версия. После установки не забудьте проложить в файле Autoexec.bat путь в директорию c:\perl\bin - туда, где содержится файл perl.exe. Проверьте правильность установки Перла, написав простейшую прог- рамму, состоящую из одной строки: print "Hello"; Запустите эту программу из любой директории, набрав "perl filename", где filename - имя файла, в который Вы вписали приведенную выше строчку. Если на экране появилось слово Hello, это ззначит что Вы все сделали правильно. В отличие от многих других вебсерверов, Апач сам вызывет интерп- ретатор Перла, таким образом в каждой программе нужно указывать, где он находиться. Таким образом, первой строчкой нашего CGI-скрипта дол- жен быть путь к интерпретатору: #!perl после того, как путь к интерпретатору указан, нужно выставить серверный http-заголовок, указывающий тип отдаваемых данных: Обратите внимание, что поле http-заголовков завершается двойным переводом строки. Сами заголовки, если их несколько, отделяются друг от друга одинарным переводом строки. Третья строчка нашей программы будет содержать необходимую для создания html-документов обвеску: print "";
print "";
print " VLINK=\"#551A8B\">\n";
Обратите внимание, что при использовании внутри команды print, двойные кавычки необходимо отчеркивать - иначе интерпретатор примет кавычки за окончание команды, а то, чт о идет после них - за незавер- шенную строку, и ответит ошибкой выполнения. Теперь необходимо вести строчку вывода, и закрыть html-докумнт. print "Hello";
print "";
Таким образом, вся наша первая программа будет выглядеть так: #!perl
print "Content-type: text/html\n\n";
print "";
print "";
print "\n";
print "Hello";
print "";
Проверьте правильность ее выполнения, запустив программу локаль- но. Для этого наберите в командной строке: perl filename, где filename - это имя Вашей программы. Если все в порядке, программа должна напи- сать на экране http-заголовок, а затем теги html-документа, который программа создает. После локальной проверки нужно запустить программу как кли- ент-серверное приложение. Для этого нужно дать программе права на вы- полнение (для операционых систем, где это актуально), и расположить в директории, в которой вебсервер распознает програмы как CGI-приложе- ния. По умолчанию, это директория cgi-bin, в которой и надо разместить нашу программу. Для запуска программы нужно набрать в окне location ее URL: http://localhost/cgi-bin/filename Как передавать данные между клиентом и сервером? Как передать данные с сервера на клиент мы уже рассмотрели. Сле- дующим шагом представляется передача данных с клиента на сервер и фор- мирование клиента с учетом переданной на сервер информации. Существуют несколько МЕТОДОВ, с помощью которых можно передать информацию на сервер; самые распространенные из них - это метод GET, передающий данные в URL и метод POST, передающий данные в теле запро- са. Недостатком первого является ограниченный объем передоваемой ин- формации (до 127 байт), недостатком виторого - сложность в формирова- нии запроса. В самом деле, чтобы сформировать запрос методом GET вполне доста- точно написать знак вопроса после URL вызова, и перечислять через ам- персанд пары "имя=значение": http://localhost/cgi-bin/test2.cgi?v1=vasya&v2=petya и так далее. Теперь нужно получить эти данные на сервере, для чего достаточно полу- чить содержимое переменной окружения вебсервера QWERY-STRING. Эта пе- ременная содержит то, что в URL располагалось после знака вопроса. Есть, однако, одна особенность, которая делает затруднительной использование этой переменнй. Дело в том, что русские буквы, как и специальные символы, в URL заперщены - поэтому их придется заменить на специальный код, который не содержит запретных символов, а просле при- ема на сервере потребуется произвести обратную перекодировку. Такая перекодировка является вполне стандартной для CGI-программирования, и в комплекте любого Перла предусмотрен модуль, который умеет читать со- ответствующую переменую, перекодировать ее содержимое и раскладывать приняные данные по переменным. Модуль, в котором содержася эти подп- рограммы называется CGI. Подключите его к своей программе, написав: use CGI qw(param); после чего Вы сможете захватывать из входного потока любую переменную, написав, к примеру: $v1=param("v1"); теперь, если Вы вызвали скрипт с помощью приведенной выше URL-и, то модуль будет искать в принятых данных переменную потока "v1", а найдя, присвоит ее значение скаляру $v1, который будет теперь равняться "vasya". Чтобы подтвердить правильность наших построений, давайте вы- полним программу, которая иллюстрирует такую передачу данных: #!perl
use CGI qw(param);
$v1=param("v1");
$v2=param("v2");
print "Content-type: text/html\n\n";
print "";
print "";
print "";
print "Hello, $v1 , $v2 !!!";
print "";

Метод POST передает данные в теле запроса, а получать их следует через входной поток программы (напомню, при запуске программы вебсер- вером он направлен в протокол HTTP). Для отсылки данных этим методом в HTML служат формы. Например, выполнив на клиенте приведенную ниже фор- му мы получим точно такой же результат, как и в предыдущем примере: <HTML>

http://localhost/cgi-bin/test3.cgi >






Модуль CGI, обрабатывающий входные данные работает совершенно одинаково как при применении метода GET, так и при использовании мето- да POST. Часто задаваемые вопросы (часть вторая) Используются некоторые материалы из "Perl FAQ created by SLY Golovanov, 2:5020/794.13" Где взять документацию по Perl? Во-первых, Perl при установке добавляет в Вашу систему команду perldoc. Выполните ее с ключем perldoc (т.е. perldoc perldoc), и она напишет как ею пользоваться. Для модулей выполняйте perldoc <имя_модуля> а для внутенних фун- кций perldoc -f <имя_функции> Во-вторых, есть кое-какие книги по Perl на русском языке: http://doc.marsu.ru/lang/perl/lama/ ftp://mshp.minsk.by/pub/incoming/lama.rar ftp://ftp.kursknet.ru/pub/books/lama_perl.zip ftp://molly.wbt.ru/incoming/lama.rar http://simplex.ru/news/ И на английском: http://solaris.inorg.chem.msu.ru/cs-books/perl/perlbookshelf.zip http://lpcs.math.msu.ru/CD_Bookshelf/Perl_content.tar.bz2 ftp://twilight.telco.md/pub/books/perlbookshelf.zip http://meltingpot.fortunecity.com/nj/80/cookbook.rar http://www.effectiveperl.com http://www.perlreference.com http://perlfect.com/articles/ http://www.perlmonth.com/ http://www.stonehenge.com/merlyn/WebTechniques/ http://www.stonehenge.com/merlyn/UnixReview/ http://www.stonehenge.com/merlyn/LinuxMag/ http://www.plover.com/~mjd/perl/#tpj http://home.od.ua/watman/perl/ http://spider.softclub.net/books/web/ http://athena.vvsu.ru:85/docs/unix/ http://athena.vvsu.ru:85/docs/tcpip/ http://athena.vvsu.ru:85/docs/www/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% А вот здесь можно взять готовые скрипты самого разного назначения: www.script.ru www.codemanual.com %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Что делать, если Ваш скрипт постоянно выдает код завершения номер 500 (внут- ренняя ошибка сервера)? 1. Попробуйте запустить программу локально, для чего наберите в коман- дной строке: perl filename (где filename это сами понимаете что). Обратите внимание, что если вы работаете в Юникс-системе, где кроме уста- новленного Вами пятого перла наверное есть еще и встроенный четвертый, и не факт что он расположен позже на путях, имеет смысл набирать perl5 filename потому что пятый perl как правило имеет такой псевдоним. Попытка выполнить программы с объектными модулями (к коим относится и модуль CGI) на четвертом Perl приведет к печальным последствиям. Если программу удалось запустить, посмотрите на сообщения от ошибках, ко- торые она выдает. Обратите внимание, что исправлять можно ТОЛЬКО первую из продиагностированных ошибок (остальные могут оказаться наведенными). 2. Если программа выполняется локально но не запускается сервером, про- верьте, правильно ли программа выставляет HTTP-заголовок, устанавливающий тип вывода. Для генерации HTML-документов он долже быть таким:
Убедитесь, что такая строка присутствует в Вашей программе до вывода любого символа в HTTP поток. Говоря упрощенно, эта команда print должна быть выполне- на раньше любой другой команды print. 3. Если это не принесло результата, проверьте тот ли Perl Вы вызываете. Во многих UNIX-системах четвертый Perl расположен по пути: /usr/local/perl а пятый по пути: /usr/local/bin/perl На всякий случай убедитесь, что пятый Perl в системе вообще установлен. 4. Если и это не помогает, постарайтесь вспомнить, не проходил ли файл с Вашим скриптом правки в текстовых редакторах из Windows. Разумеется, это ак- туально только в том случае, если Вы запускаете скрипт на Unix-системе. Дело в том, что у Windows и Unix различные символы конца строки. Любой встроенный в Windows редактор оперирует с концами строк стандарта Windows, при этом Unix не может выполнить такой файл. Для борьбы с таким эффектом рекомен- дуется либо создавать и редактировать файлы только в Unix-системах, либо соз- давать и редактировать их в Windows только встроенным редактором менеджера FAR, который позволяет выбирать тип создаваемого файла через нажатие shift-F2. По умолчанию этот редактор использует те символы окончания строк, которые уже есть в файле (то есть созданный в UNIX файл можно сохранять "как есть", не за- думываясь о его типе). Если Ваш скрипт уже создан в стандарте Windows, а Вы хотите запустить его на Unix, воспользуйтесь, например, вот такой программой: $v1 = "\x0d";
open A, "f1";
while ($line=)
{
$line =~ s/$v1//g;
$itog .= $line;
}
close A;
open B, ">f1";
print B "$itog";
close B;
Эта программа открывает на чтение файл с именем f1, расположенный по мес- ту запуска, читает оттуда по очереди все строки, заменяя окончание каждой из них. После чтения программа открывает тот же файл как новый на запись и запи- сывает в него полученый результат. 5. Как последний шанс - проверьте, имеет ли скрипт права на чтение и вы- полнение со стороны того пользователя, от которого работает вебсервер. Нет, вы все-таки это проверьте. Если Вам и это не поможет, пишите в конференцию. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Как посмотреть все переменные окружения вебсервера, активные на данный момент? for (keys %ENV) { print "$_ = ${ENV{$_}}\n" } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Что такое ключи (cookies), и для чего они нужны? Ключи - это способ открыть файл на диске клиента. Поскольку такой файл - это потенциальный вирус, эта процедура должна быть как следует защищена на уровне браузера. Ключ можно установить на время существования запущеного брау- зера или на определенный срок. Для первого типа ключей можно не указывать вре- мя, когда ключ будет удален, для второго типа нужно указать это время, причем в доступном для браузера формате. Если браузер не сможет установить в своем календаре даты, когда ключ должен быть удален, он сотрет его при первом же закрытии программы. Для того, чтобы автоматизировать процесс составления даты, применяется процедура, устанавливающая дату на месяц вперед от настоящего мо- мента: sub get_cookie_date{
my(@day, @mon, $i, $count, $sec,$min,$hours,$mday,$mon,$year, $wday, $yday,
$isdst, $result);
($sec,$min,$hours,$mday,$mon,$year, $wday, $yday, $isdst)=gmtime(time+2592000);
@day=("Sunday", "Monday", "Tuesday", "Wednesday", "Thurday", "Friday",
"Saturday");
@mon=("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct",
"Nov", "Dec");
if($year >= 100){
$year = $year - 100;
if($year < 10){$year = "0$year";}
}
$result=$day[$wday].", ".$mday."-".$mon[$mon]."-".$year."
".$hours.":".$min.":".$sec." GMT";
return $result;
}
Не забудьте положить в какой-либо скаляр путь к Вашей программе от корня соответсвующей области сервера. Имя программы указывать не надо, оно будет пе- редано отдельно. Например: $path = "/cgi-bin";
Теперь Вы всегда можете установить ключ, выполнив в своей программе вот такой фрагмент кода: $date=get_cookie_date();
print "Set-Cookie: login=$log; path=$path; expires=$date\n";
print "Set-Cookie: password=$pas; path=$path; expires=$date\n";

Для того, чтобы считать ключ также предусмотрена специальная процедура: sub get_cookie{
my (%cook, @temp, $i, $count, $key, $value);
(@temp)=split(/;/, $ENV{"HTTP_COOKIE"});
$count=@temp;
for ($i=0; $i<$count; $i++){
$temp[$i]=~s/ //;
($key, $value)=split(/=/, $temp[$i]);
$cook{$key}=$value;
}
return %cook;
}
После этого получить значение ключа можно, например, так: if ($ENV{HTTP_COOKIE}){$cookies=1; %cookies=get_cookie();}
else {$cookies=0;}
if ($cookies==1)
{
$login=$cookies{"login"};
$pass=$cookies{"password"};
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Как скопировать из сети какой-либо файл? Проще всего проинсталлировать на Вашу систему модуль libwww, который поз- воляет делать это. Вот пример его использования:
#!/usr/local/bin/perl
use LWP::UserAgent;
use CGI qw(header);
my $URL = "http://www.rbc.ru/kpc/topnews/news_inc.html";
my $res = LWP::UserAgent->new->request(new HTTP::Request GET => $URL);
binmode(STDOUT);
print $res->content;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Как скопировать какой-либо файл на сервер? Для этого нужно применить кодировку Multipart метода post, она позволяет передавать на сервер даже бинарные файлы, причем размер их не ограничен. К со- жалению, не все браузеры поддердживают эту кодировку. Netscape держит ее со второй версии, MSIE- с версии 3.02. Вот пример использования этого способа: #!/usr/local/bin/perl
use CGI qw(param);
$mode=param("mode");
$file=param("file");

# директория, в которые записывается принимаемый файл.
$fup = "/huge/httpd/htdocs/ufo/up";
if ($mode eq "upload")
{
print "Content-type: text/html\n\n";
@name= split(/\\/, $file);
@name= reverse (@name);
($file1) = @name;
$file_new="$fup/"."$file1";
open A, "+>$file_new";
binmode A;
binmode $file;
while ($bytesread = read($file, $buf, 1024))
{
print A $buf;
}
close A;
print "";
print "";
print "Файл успешно перенесен на сервер.
";
print "

";
print "";
print "";
print "";
print "
";
print "
";
print "";
print "";
}
elsif ($mode eq "")
{
print "Content-type: text/html\n\n";
print "";
print "";
print "

Предупреждение. Программа пересылки файлов не работает с браузера-
ми Internet Explorer версии ниже 3.2"; print "

action=\"/cgi-bin/upload.cgi\" enctype=\"multipart/form-data\"
name=\"upload\">";
print "
Upload file:
";
print "";
print "
";
print "
";
print "
";
print "
";
print "";
print "";
}
Часто задаваемые вопросы (часть третья) Как послать письмо (в UNIX-системе). Для работы с почтой в UNIX-системах традиционно используется программа Sendmail. Обращаться к ней можно непосредственно, а можно через команду mail. В любом случае, нужно сначала подготовить адреса, заменив в них символ "@" на "\@" - в противном случае программа не может быть выполнена. $as1="@";
$as2="\@";
$mails =~ s/$as1/$as2/g;
где $mails - это адрес или серия адресов, разделенных пробелами. Письма традиционно отправляются в кодировке koi-8, в которую надо пере- вести наш текст. Сделать это можно, записав тело письма, допустим, в скаляр $as4 а затем выполнив над ними следующую операцию (для перевода из кодировки 1251 в кодировку koi-8): $as4 =~
tr/АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюяЁё/бвчздецъй
клмнопртуфхжигюыэящшьасБВЧЗДЕЦЪЙКЛМНОПРТУФХЖИГЮЫЭЯЩШЬАСi?/;

Open MAILL, "|mail -s \"Subject\" $mails";
# В скаляре $mails через пробел перечисляются все адреса
print MAILL "$as4"; # это тело письма
close MAILL; Используя программу Sendmail можно посылать письмо следующим образом: open(MAIL, "|/usr/lib/sendmail -f $from_addr $mails");
print MAIL "Subject: subject_text\n";
print MAIL "content-type: text/html; charset=koi8-r\n\n";
print MAIL "To: $user <$to_addr>\n"; # На какой адрес отвечать.
print MAIL "$as4";
close MAIL;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Как прочитать принятое письмо? Самый простой способ, это использование библиотеки mail. #!/usr/local/bin/perl
use Mail::POP3Client;
$pop = new Mail::POP3Client("login", "password", "mail.server.ru");
for ($i = 1; $i <= $pop->Count; $i++) {
$bbb = $pop->Body($i);
$aaa = $pop->Head($i);
foreach ($pop->Head($i)) {/^(From|Subject): / and print $_, "\n";}
# $pop->Delete($i); #так удаляют прочитанное письмо
print "$aaa \n";
print "$bbb \n";
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% LWP FAQ by Paul Kulchenko (
[email protected]), updated 03/04/2000 Это описание модуля LWP (иногда называемого LibWWW), содержащего множество весьма полезных функций. ==================================================================== 1.1. How to get text file (http, ftp)? 1.2. How to get jpeg/gif/bmp file and return it? 1.3. How to access password protected file? 1.4. How to set up REFERER and other HTTP header parameters? 1.5. How to get specified part of file (first MAXSIZE bytes)? 1.6. How to get and set up cookies? 1.7. How to specify proxy servers? 1.8. How to check for redirect? 1.9. How to create parameters for POST method? ==================================================================== 1.1. How to get text file (http, ftp)? Как получить файл через http или ftp use LWP::UserAgent;

My $URL = " http://www.yahoo.com/ ";
my $res = LWP::UserAgent->new->request(new HTTP::Request GET => $URL);
print header, $res->is_success ? $res->content: $res->status_line;
==================================================================== 1.2. How to get jpeg/gif/bmp file and return it? Как получить картинку. use LWP::UserAgent;
use CGI qw(header -no_debug);
$URL ="
http://a100.g.akamaitech.net/7/100/70/0001/www.fool.com/art/new/butts/go99 .
gif";
my $res = LWP::UserAgent->new->request(new HTTP::Request GET => $URL);
binmode(STDOUT);
print $res->is_success ? (header("image/gif"), $res->content)
: (header("text/html"), $res->status_line);
==================================================================== 1.3. How to access password protected file? Как ввести пароль. BEGIN {
package RequestAgent;
use LWP::UserAgent;
@ISA = qw(LWP::UserAgent);

Sub new { LWP::UserAgent::new(@_); }
sub get_basic_credentials { return "user", "password" }
}
use CGI qw(header -no_debug);

My $res = RequestAgent->new->request(new HTTP::Request GET => $URL);
print header, $res->is_success ? $res->content: $res->status_line;
==================================================================== 1.4. How to set up REFERER and other HTTP header parameters? Как установить переменные окружения сеанса. use LWP::UserAgent;
use HTTP::Headers;
use CGI qw(header -no_debug);

My $URL = " http://localhost/cgi-bin/hello.cgi ";
my $res = LWP::UserAgent->new->request(
new HTTP::Request(
GET => $URL,
new HTTP::Headers referer => "
http://www.yahoo.com "),
);
print header, $res->is_success ? $res->content: $res->status_line;
==================================================================== 1.5. How to get specified part of file (first MAXSIZE bytes)? Как получить часть файла. use LWP::UserAgent;
use CGI qw(header -no_debug);

My $URL = " http://www.yahoo.com/ ";
my $MAXSIZE = 1024;

Print header;
my $res = LWP::UserAgent->new->request(
new HTTP::Request(GET => $URL), \&callback, $MAXSIZE);

Sub callback { my($data, $response, $protocol) = @_; print $data; die }
==================================================================== 1.6. How to get and set up cookies? Как установить и считать ключ. use LWP::UserAgent;
use CGI qw(header -no_debug);
use HTTP::Cookies;

My $URL = "http://mail.yahoo.com/";

My $ua = new LWP::UserAgent;
my $res = $ua->request(new HTTP::Request GET => $URL);
my $cookie_jar = new HTTP::Cookies;
$cookie_jar->extract_cookies($res);

Print header;
if ($res->is_success) {
my $req = new HTTP::Request GET => $URL;
$cookie_jar->add_cookie_header($req);
$res = $ua->request($req);
print $res->is_success ? $res->as_string: $res->status_line;
} else {
print $res->status_line;
}
==================================================================== 1.7. How to specify proxy servers? Как работать через прокси. use LWP::UserAgent;
use CGI qw(header -no_debug);

My $URL = " http://www.yahoo.com/ ";
my $ua = new LWP::UserAgent;

$ua->proxy(["http", "ftp"], " http://proxy.sn.no:8001/ ");
$ua->proxy("gopher", "
http://proxy.sn.no:8001/ ");

My $res = $ua->request(new HTTP::Request GET => $URL);
print header, $res->is_success ? $res->content: $res->status_line;
==================================================================== 1.8. How to check for redirect? Как сделать редирект use LWP::UserAgent;
use CGI qw(header -no_debug);

My $URL = " http://www.yahoo.com/ ";
my $res = LWP::UserAgent->new->request(new HTTP::Request GET => $URL);

Print header;
print $res->request->url if $res->previous->is_redirect;
==================================================================== 1.9. How to create parameters for POST method? Как отправить запрос методом POST без помощи формы. use URI::URL;
use HTTP::Request;
use LWP::UserAgent;
use CGI qw(header -no_debug);

My $URL = " http://yahoo.com/?login=mylogin&password=mypassword ";
my $uri = new URI $URL;
my $method = "POST";

My $request;
if (uc($method) eq "POST") {
my $query = $uri->query;
(my $url = $uri->as_string) =~ s/\?$query$//;
$request = new HTTP::Request ($method, $url);
$request->header("Content-Type" => "application/x-www-form-urlencoded");
$request->content($query);
} else {
$request = new HTTP::Request ($method, $uri->as_string);
};

# add Host field as required in HTTP/1.1
$request->header(Host => $uri->host_port) if $uri->scheme ne "file";

My $res = LWP::UserAgent->new->request($request);

Print header, $res->is_success ? $res->content: $res->status_line;
====================================================================

Это важное событие в мире программирования произошло в 1986 году, когда обычный на первый взгляд парень Ларри Уолл после кропотливой работы объявил миру, что разработал язык программирования Perl. Путь к этому знаменательному событию оказался трудным и тернистым, но результат того стоил. Как, кто и зачем разработал новый язык программирования? Здесь есть ответы на все эти вопросы.

Предыстория

Толчком для этого открытия послужила Тогда он принимал участие в проекте UNIX. Работа была сложная, так как необходимо было создать безопасную сеть со многими уровнями, чтобы была возможность объединить работу нескольких компьютеров, работающих друг от друга на значительных расстояниях. Весь процесс был выполнен успешно, но вот отчеты пришлось делать очень трудоемкие, не только с огромным количеством файлов, но и с между ними.

Уолл решил применить для работы фильтр awk, но возникло неожиданное препятствие: невозможно было управлять ни открытием, ни закрытием огромного числа файлов - по иронии - на основе в них же содержащейся информации о расположении этих файлов.

Вначале Ларри, чтобы разрешить непредвиденную проблему, решил написать специфическую системную утилиту. Она, казалось бы, являлась выходом из создавшейся ситуации. Но до этого им было уже составлено несколько утилит для решения этой проблемы, которые, к сожалению, не стали выходом для стандартов UNIX.

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

Новый язык программирования: причина возникновения

Как утверждал Ларри, помогла ему создать новый язык лень. Но именно та лень, которая позволила решить важную задачу: как избежать составления многочисленного числа программ на разных языках, которые были неотъемлемой частью инструментальных средств UNIX. Слишком утомительной была такая процедура.

Достоинство нового языка оценили другие, так как в нем гармонично сочетались возможности обработки файлов и системного администрирования. А это именно два необходимых факта, которые нужны во время программирования системы UNIX.

Следует отметить, что у языка программирования Perl есть небольшое отличие от других подобных языков: он появился оттого, что в нем назрела необходимость, а не для того, чтобы поразить пользователей или придумать очередное красивое средство, которое не сыграет особой роли.

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

Особенности

В переводе на русский язык аббревиатура Perl звучит как «практический язык, чтобы извлекать данные и составлять отчеты».

Символом этого вида языка решили сделать верблюда, наверное, посчитав, что, так как животное это благородное, выносливое, способно много дней безропотно нести тяжелую ношу, такой же труд напоминает нагрузку на новый язык, тоже нешуточную.

Почему новый язык сразу оценили многие пользователи, есть много причин. Кто пользуется системой UNIX, знает, что настройки здесь проходят через специальные файлы - обычные текстовые, а изменения осуществляются после выполнения команд. Они написаны на особом языке оболочки, а их выполнение происходит из командной строки.

Система UNIX позволяет создавать индивидуальные команды, опираясь на команды интерпретатора и сохраняя их. Они остаются в текстовых файлах, и если требуется, выполняются как стандартный набор команд операционной системы - только через командную строку.

Команды пользователя иначе именуются скрипты. В системе UNIX приходится операционному администратору писать большое количество скриптов, которые, в свою очередь, обрабатывают последующие скрипты, т. е. текстовые файлы с использованием специальных программ:

  • Awk. Программа дает возможность сопоставлять с данными образцами и служит генератором отчетов.
  • Sed. Выступает как пакетный редактор для текстовых файлов.

Программы в качестве фильтров поочередно считывают строки входных файлов. Затем они выполняют применимые к строке действия, которые определяются благодаря командам программ. При этом выделяется цепочка символов по определенным шаблонам, замена по установленным правилам, генерируются новые файлы.

Большие возможности

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

Со временем этот уникальный язык расширил свои границы, и теперь широко используется в веб-разработках и играх, если необходимо сетевое программирование или графическая для пользователей.

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

Не зря один из девизов Л. Уолла гласит, что вещи простые могут оставаться простыми, но сложные обязаны выполняться.

Освоить язык несложно, разобравшись в выражениях присваивания, блоках кода, управляющих структурах и функциях.

Схожесть c другими языками

Ларри многое позаимствовал из других языков программирования. Например:

  • Командные оболочки UNIX. Переменные маркированы ведущими знаками, они четко выражают тип переменной и помогают этим переменным являться в строках интерполированными. Встроенные функции обеспечивают инструментарий, а он используется для программирования оболочки.
  • Массивы из Лиспа.
  • Использование Perl регулярных выражений из awk , заодно позаимствовав от него ассоциативные мотивы.
  • Из sed.

Но с собственными задачами новый язык справлялся гораздо быстрее, и его, поэтому начали применять не только для решения задач системного администрирования.

Уолл почерпнул у Г. Спенсера пакет, который помог освоить Perl регулярные выражения, модифицируя его под свое детище. Многие разработанные функции - заслуга не только Ларри. Коллеги и друзья не менее увлеченно старались привнести в разрабатываемую уникальную программу свои новшества. А когда язык появился в интернете, образовалось целое сообщество единомышленников, которые тоже помогли его усовершенствовать. В работе задействовано с тех пор, как утверждает статистика, более 10 000 программистов.

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

Этапы развития

Небольшие, но значительные этапы пути можно выделить в таблице.

Выпускаемые версии

Время создания

perl 1. Много возможностей не содержала. Это был самый простой способ поиска в файлах по шаблонам. Но имелись дескрипторы файлов, формат и скалярные переменные.

1988 год. Январь.

perl 2. Появился пока еще не усовершенствованный механизм регулярных выражений.

1988 год. Июнь.

perl 3. Разработчики добились возможности обработать потоки двоичных данных.

1989 год. Октябрь.

perl 4. Появилась по большей части благодаря книге, увидевшей свет, «Programming Perl», но под названием больше известным, как «Верблюжья книга». Закрепил документировано новый язык. Этот период прошел целую серию релизов, в результате остановившись на версии 4.036. Это был уже 1993 год. Тогда началась работа над следующей - V - версией.

1991 год. Март.

perl 5. Появилась поддержка сложных типов данных, объектная модель, что включает в себя ссылки, пакеты, а также замыкание в качестве значения. Создается список рассылок, чтобы можно было координировать работу на разные платформы. По сути, это явилось главным форумом по разработке, портированию и обслуживанию. Модули теперь являются с важной частью версии, ведь они смогли расширить язык, но без участия модифицирования интерпретатора. Это смогло его стабилизировать, однако расширило языковые возможности.

1994 год. Октябрь.

Уникальный Perl - язык программирования: плюсы и минусы

Perl 5 активно разрабатывается и теперь, пополняясь все новыми версиями. Но все разработки роднит несколько факторов: выполняется автоматическая типизация данных, проводится автоматический контроль над памятью.

Благодаря интерпретатору известны не только типы, но и запросы памяти каждого объекта программы, и ему не составляет труда распределить память, освободить при подсчете ссылок.

Нужно отметить, что Perl-программирование отличает интерпретатор от других. Доказательством тому являются трансляция программы в промежуточный байт-код, а уже потом начинает выполняться. В сравнение: традиционный работает немного иначе - вводимый оператор интерпретируется и мгновенно выполняется, что чревато синтаксическими ошибками во время рабочего процесса. Perl позволяет обнаружить такого рода ошибки уже в период трансляции в бай-код.

Для того чтобы перевести один вид данных в другой, потребуется автоматический процесс, если же невозможны переводы каких-либо видов данных, это может привести к роковой ошибке.

Заслуга версии 5 004 в том, что здесь имеется пакет UNIVERSAL, который языку дал основной объект, а от него произошли все классы - на автоматической основе. Появилась возможность запросить версию модулей. Стало реальностью поддерживать запрашивать версию модулей. В дополнение к этому perl стал поддерживать многие операционные системы, и Microsoft Windows в том числе.

Версия 5.005, вышедшая в 1998 году, значительно повысила качество процессора регулярных выражений, улучшила новые перехваты в бэкенд, что решилось с помощью определенных модулей и расширила поддержку операционных систем.

Последние обновления

Двухтысячный год подарил миру новую, 5.6, версию языка перл. Она уже выглядела намного солидней первых, имела 64-битные системы, в состоянии была поддержать файлы более двух Гб, включала представление строк, учитывая стандарт юникод, а также ключевое слов - our. В этот период меняется схема наименований версий, чтобы она была более близкой к другим проектам - с открытым исходным кодом.

Интересным фактом является такое решение: если в разработке находится версия, ей будет присвоен номер с нечетными цифрами, а стабильная получает четную нумерацию.

Уолл тогда обратился к своим приверженцам с просьбой вносить предложения для создания более продвинутой версии. Его призыв был услышан, а итогом явился 361 документ, что помогло разрабатывать VI версию. На суд пользователям представили документ, который, скорее всего, походил на сводку, а эта версия существовала, но лишь в виде описания языка. Ряд документов превратился в спецификацию этой версии. Попытка запустить в действие интерпретатор VI версии в 2006 году была остановлена. Но с 2009 года под названием Rakudo Perl эта версия живет и периодически ее обновляют.

Значительное изменение процесса разработки Perl 5 произошло после появления Perl 5.11. Сообщество разработчиков перешло на ежемесячный цикл выпусков, с планированием даты выпуска на три месяца вперед.

Новая версия

Версия 5.8 появилась в 2002 году. Знаменита она тем, с этого времени ежегодно обновлялась до 2008 года, значительно улучшила поддержку юникода, добавила много функций, в которые входят поддержка многопоточности, оригинальная реализация ввода-вывода и увеличила точность числовую. И, опять же, появились новые модули.

К 20-летию создания языка программирования общего назначения новая версия под номером «5.10.0» не разочаровала пользователей в очередной раз. Появились новые операторы, а также «умный» - совпадения, прошло обновление регулярных выражений.

Что принесли последние годы работы?

Каждый год все новые усовершенствования помогали сделать язык, изобретенный Уоллом, все наиболее легче проще и доступнее. 2010 год ознаменовался тем, что синтаксис языка perl получил поддержку package NAME VERSION, регулярных выражений, в последующие годы обновлялись модули, расширялась поддержка операторов.

Была достигнута цель - указать во время работы ту версию, которую следует эмулировать, значит, позволить обновить perl, но при этом не потерять рабочие способности использованных скриптов, которые представляют угрозу оказаться несовместимыми с представленной новой версией. Стало больше функций, увеличилась безопасность.

В конце мая, совсем недавно, появилась очередная версия, как всегда, более усовершенствованная и удобная для работы. Сегодня ее может протестировать любой желающий и на своем лично опыте убедиться, что для создания этого языка программирования проделано немало работы.

В этом языке Perl массивы не ограничены. Можно решать, используя язык, нетрадиционные задачи, для осуществления которых было бы в другом случае задействовано несколько, выполнить задания администрирования, обработать качественно текстовые файлы, и на все проблемы времени будет затрачено не так много. Разрабатывая новые программы, используя таблицу символов, задействуя необходимых операторов, результат получится правильный и быстрый.

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