sonyps4.ru

Perl язык программирования для начинающих. FAQ по языку Perl для начинающих

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

Эту статью я решил написать, после того как узнал насколько сложно "врубиться" во всё, даже если у вас есть под рукой какое либо пособие по PERL. Везде, уже в самом начале, начинают ссылаться на какие-то загадочные термины и команды, а вам остаётся только удивлённо хлопать глазами, или (если вы всё же что-то поняли) заставить эти программы работать (не "как надо", а вообще!). Эту статью можно было бы назвать "PERL для чайников", если бы она охватывала весь материал, но здесь я ставлю перед собой цель дать вам лишь необходимые начальные понятия, и так сказать "подготовить к дальнейшим сражениям":). Хотя вполне возможно, что в дальнейшем, "по просьбам трудящихся", эта небольшая статья разрастётся в нечто большее.

Итак... начинаем!

Для начала сообщу вам, что PERL необходимо установить на ваш компьютер. Эту, казалось бы, простую операцию некоторые мои знакомые начисто пропускали, а после, написав простенькую программу, долго пытались её запустить... ;) Наиболее доступный пакет PERL (на мой взгляд) - это ActivePerl, хотя, этот пакет ориентирован на пользователей Windows, а если у вас UNIX, то можно скачать что нибудь родное с www.perl.com. Так или иначе, вы достанете и поставите себе perl (если уже этого не сделали). Так вот: у вас появится новая папочка "perl", но это вовсе не значит, что все проги нужно помещать именно туда:) Perl, там сидящий, лишь исполняет все ваши гениальные творения с расширением *.pl , а уж где они сами находятся - одному юзеру известно:) (справедливо для пользователей windows с установленным пакетом ActivePerl, т.к. он ассоциирует файлы *.pl).

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

#!/usr/bin/perl

Всё дело в том, что язык этот создавался на базе ОС UNIX, а эту строку нам пытаются передать в "наследство" от их операционки. Однако вам следует помнить, что на сервере (если вы решите скинуть туда свои проги) может стоять и UNIX.

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

Практически все руководства по этому языку начинаются с самой простой программы, которая выглядит примерно так:

print ("hello, WORLD!\n");

Некоторые из вас уже, наверное, скопировали приведенную программу в свой файл и заметили, что она быстренько открывается и также быстро закрывается. Это связанно с тем, что программа есть программа, и после того как она выполнится - сразу же закроется, поэтому добавьте к программе ещё одну строку с следующим содержанием:

В итоге всё это примет следующий вид:

print ("hello, WORLD!\n"); ;

Не так уж и просто выглядит для непосвященного... Даже немного пугающе... Но это только для непосвященных, на самом деле всё - проще некуда! :) Не верится? Сейчас докажу. Во-первых, вам нужно узнать, что print - это команда, которая выводит информацию на стандартный вывод STDOUT (STanDart OUT или, проще говоря - вывод на монитор). Во-вторых, непонятность в виде \n - это переход на новую строку (newline), но не программы, как могли бы испугаться некоторые, а информации на экране, т.е. если бы вы продолжили бы текст, заключенный в кавычки, то после этого символа он был бы напечатан с новой строки. А если вам понадобилось бы в самом тексте использовать обратный слеш (шелс:), то перед ним надо поставить еще один шелс. Например:

print "\a"; #Команда, после которой Perl #выведет сигнал на SPICERprint "\\a"; #Perl просто выведет на экран \a

Затем хочу вас обрадовать: скобки нафиг не нужны:) Их использование зависит целиком от вашего настроения, хотя в мануалах говорят, что это якобы помогает выделить текст в программе. В общем - кому как больше нравится... Как вы уже наверно догадались - кавычки нужны для заключения в них текста, так что осталось два непонятных пунктика. Но перед тем как остановится на них, считаю необходимым объяснить вам какая бывает информация в Perl. Фундаментальной единицей информации в Perl является скаляр (scalar), т.е. отдельное значение, хранящееся в отдельной переменной.

$a = "hello, world!"; #Присвоить переменной $a некий текст $b = 777; #Присвоить переменной $b некое число

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

$abc = "123"; #Число в строке $123 = 123; #Число как таковое

Если вам нужно для вычислений число, то просто не ставьте двойных кавычек.

Точка с запятой в конце каждой строки - это собственно... конец строки, из чего следует, что вы можете написать всю программу в одну строку, но нам что - строк жалко что ли:) Из выше сказанного есть исключение: знак # говорит о том, что всё, что есть в строке после него - это комментарий, и к программе уже не относится. Знак ромб - это по умолчанию или, говоря понятным языком - стандартный ввод с монитора (разъясняю: на мониторе появляется запрос, а вводите вы конечно же через клаву. Потом нажимаете ентер и введенное значение уже в переменной Perl, если она была задана). Вся хитрость добавления этого ромба в нашем случае в том, что он будет запрашивать у вас этот ввод, пока вы не нажмете кнопку "enter", а так как в программе не указанно, что делать с этим вводом, то perl о нём просто забудет и станет считать нашу программку завершенной. И врезультате выполнения этой программы мы с вами увидим на своих мониторах текст Hello, world! .

Теперь немного усложним нашу программку:

print "enter your name: "; $name = ; print "hello $name!"; ;

Вам следует уяснить, что программы выполняются построчно, т.е. сначала первая строка, после неё вторая и т.д..

Итак, в первой строке мы выводим предложение ввести имя пользователя. Во второй строке мы его считываем в переменную $name. $name - это, как уже говорилось, скалярная переменная Perl, которая начинается знаком доллара. Забегая вперёд, скажу вам, что кроме переменных, начинающихся с доллара, бывают также массивы (@массив), хэши (%хеш), и ещё несколько видов, о которых пока рано рассказывать. Между переменной и ромбом стоит равенство, это значит, что мы присваиваем переменной результат запроса. В третьей строке мы выводим слово hello, а после него выводим то, что хранилось в переменной $name. В нашем случае это имя, которое мы просили ввести.

Сделаем ещё одно отвлечение, в котором я расскажу вам, что можно делать с переменными... С ними можно делать ВСЁ! И это не преувеличение. Например, возможно такое:

$a = 3; $b = 4; $c = $a+$b; #Сложить две переменные и #присвоить их третьей print $c; # Вывести получившееся число print $a+$b; # тоже самое, только без # привлечения третьей переменной

Надеюсь с этим всё понятно... А пока до некоторых доходит, мы напишем программку, которая выполняет команды ДОС dir. Для тех кто не знает - dir - команда выводящая на экран содержимое директории в которой вы находитесь.

$dos = `dir`; print $dos; ;

Эта программка считывает в переменную $dos результат выполнения команды dir, которая заключена в обратные кавычки, (если бы это были простые кавычки, то получилась бы не команда, а просто слово) после чего выводит на монитор этот самый результат.

Теперь так сказать вернёмся к нашим баранам, вернее пока лишь к барашкам:) Мы научились выводить на экран необходимый нам текст, получать информацию от пользователя, а так же узнали, что ДОС команды в обратных кавычках будут выполняться как ДОС команды:) Самое время написать программку, которая будет запрашивать не что иное, как эти самые команды

print "enter comand: "; chmod($com =); print `$com`; ;

Из соображений безопасности крайне не рекомендую вводить команду FORMAT, догадайтесь почему:) Из новшеств нужно выделить появление команды chmod(). Эта команда убирает из информации, которую мы получаем в запросе знак новой строки \n, который есть там по умолчанию. То, что находится во второй строке - это сокращенная запись двух строк:

Выгадываем мы этим всего несколько символов, но ведь всё равно приятно:)

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

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;
====================================================================

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

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

Нам нравятся некоторые особенности языка: зависимость результата от контекста, ассоциативные массивы, тип данных typeglob, пакеты, реализация объектно-ориентированного программирования и, конечно, средства обработки текста. Если вам не интересно хотя бы узнать, что все это означает, то можете книгу отложить. Если все перечисленное вам уже известно, то тоже можете ее отложить, потому что эта книга для тех читателей, кто еще только начинает изучать Perl самостоятельно.

Язык Perl создан системным программистом Ларри Уоллом (Larry Wall) как средство UNIX, позволяющее «склеивать» из программок, выполняющих отдельные функции, большие сценарии для решения комплекса задач, связанных с администрированием, обработкой текста и т. д. В дальнейшем он вышел за эти рамки, превратился в настоящий язык программирования, в котором нашли отражение многие тенденции, обозначившиеся в технологии программирования за последнее десятилетие, и получил широкое распространение в связи с развитием Inernet. Perl является основным средством создания приложений CGI, удобен для решения задач администрирования Web-серверов, электронной почты и других систем. Благодаря быстроте и легкости написания сценариев на этом языке он распространился и на другие платформы: DOS, Windows, OS/2, Mac, VMS и пр. Одно из основных достоинств языка Perl - его открытость и доступность. В сети Internet можно получить совершенно бесплатно исходные тексты интерпретатора perl (язык Perl - интерпретируемый, что в некоторых случаях является преимуществом) и модулей его расширения.

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

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

Наиболее полезные тесты файлов в Perl

Программирование с Perl довольно простое, которое выполняется для букв, которые вы используете для проверки файлов. Например, r проверяет, может ли файл r ead, а T ищет файл t ext. Вот наиболее полезные тесты файлов в Perl:

Специальные символы в Perl

Как и любой язык программирования, Perl использует специальные команды для специальных символов, таких как обратные или вертикальные вкладки. Итак, если вам нужно запрограммировать звонок или звуковой сигнал или только возврат каретки, проверьте следующую таблицу для символа, который ее произведет:

Операторы Perl True-False Comparison

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

push (@r, @s)

сращивание (@r, $ # r + 1, 0, @s)

Любая цифра

Матч 1 или более раз

*

Совпадение 0 или более раз >?

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

  • Часть 1: Типы переменных (вы читаете эту часть)

В нем вы найдете примеры простых программ из серии «вывести числа от 1 до 5» и тому подобное. Мне всегда нравилось учиться на примерах — это интереснее и быстрее, чем по книжкам или на семинарах. Также можете посмотреть посты этого блога, — велика вероятность, что в них вы найдете еще примеры.

Я предполагаю, что в школе/институте вы изучали Pascal/Delphi, C или хотя бы Basic, и объяснять, что такое функция и циклы не требуется. Если это не так — ничего страшного, просто для того, чтобы во всем разобраться, вам придется потратить лишнее время на чтение Википедии. Если вы не знаете, как запустить bash-скрипт, или для чего в первой строке скрипта писать что-то вроде #!/bin/sh , придется немного погуглить , чтобы это выяснить.

Специально для тех, кого интересуют вопросы, «а правда ли, что Perl очень сложен», «а какие книжки по Perl можете посоветовать» и даже «эээ… а что, на нем еще пишут?», я написал Mini-FAQ по Perl , которое вы можете прочитать на HabraHabr. А для тех, кто неасилил многабукв здесь я приведу краткое его содержание:

  • Perl — современный язык программирования, на котором пишут и будут писать еще очень долго.
  • Perl, как и любой другой язык программирования, имеет свои достоинства, недостатки и области применения. Существует действительно большой класс задач, которые Perl решает на 5+.
  • Синтаксис Perl не сложнее синтаксиса C++ или Java. В этом вы сможете убедиться, дочитав данный пост до конца.
  • Существуют хорошие и при этом недорогие учебники по Perl. Также в сети вы без труда найдете сообщество perl-программистов, говорящих на вашем родном языке.
  • Perl хорошо работает как под операционными системами семейства UNIX, так и под Злом Windows.

Дополнение: Также я рекомендую вам ознакомиться со статьями Perl vs Python vs Ruby vs PHP и Жрецы программирования . Первая повествует о производительности различных скриптовых языков, вторая — об отличии PHP от других ЯП. Фанатам Пайтона советую прочитать заметку Тест производительности скриптов на Python . Надеюсь, что эти материалы помогут вам найти ответ на вопрос «чем хорош Perl».

Привет, %username%!

Итак, давайте уже напишем наш первый скрипт на Perl!

#!/usr/bin/perl

$name = shift () ;
print ("Hello, $name!\n " ) ;

Запускаем скрипт:

$ chmod u+x 1 .pl
$ ./ 1 .pl afiskon
Hello, afiskon!

Тут все очень просто:

  • Имена скалярных переменных (то есть не массивов и не хэшей, что это такое — см ниже) начинаются со знака доллара.
  • Функция shift возвращает очередной аргумент скрипта. Другими словами первый вызов shift() возвращает первый аргумент, второй вызов — второй аргумент и так далее.
  • Функция print() выводит строку, переданную в качестве аргумента.
  • В строку можно подставлять значения переменных (см строку 4). Подробнее о строках — см далее.

Если пока не очень понятно — ничего страшного. Возможно, немного теории внесет чуть больше ясности.

Типы переменных

В Perl существует три основных типа переменных: скаляры (числа и строки), массивы — подобно тем, что используются в Pascal или C (иногда массивы еще называют векторами), и хэши (ассоциативные массивы).

Скаляры мы уже использовали в предыдущем примере. Вот еще несколько примеров задания скаляров.

#!/usr/bin/perl

$a = 123 ;
$b = - 7.496 ;
$c = 0xABC; # равно 2748, да, это комментарий:)
$d = ($a + $b ) / $c ;
$d *= $a ; # тоже самое, что $d = $d * $a;

$str1 = "hello" ;
$str2 = "$str1, world" ; # в $str2 записано "hello, world"
$str3 = $a . "\n " . $str2 ;
$str4 = "$str1" ; # в $str4 записано "$str1", а не "hello"

Тут мы задаем положительные и отрицательные, целые и дробные числа, задаем число в шестнадцатеричной кодировке, складываем, умножаем и делим — все как в Си или Java. Кроме перечисленных операций Perl также поддерживает операцию возведения в степень:

$a = 2 ** 8 ; # результат: 256

Со строками все примерно так же, как в каком-нибудь PHP. Точка означает операцию конкатенации (то есть «склеивания» строк), если в строке содержатся имена переменных, на их место подставляются значения, с помощью обратного слэша можно вставлять символы новой строки (\n), табуляции (\t), кавычки (\"), сам обратный слэш (\\) знак доллара безо всякой подстановки переменных (\$) и многое другое. Если строка в одинарных кавычках, символы в ней трактуются «как есть», без подстановки переменных и тд.

Как и PHP, Perl интерпретирует скаляры, как числа или как строки в зависимости от операции. Все просто:

$int1 = "11" + 22 ;
# ^ строка "11" преобразуется в число,
# после чего выполняется сложение, результат: 33.
$str1 = "11" . 22 ;
# ^ число 22 преобразуется в строку,
# после чего выполняется конкатенация, результат: "1122".

Правила преобразования из строки в число и наоборот тут те же, что и в PHP:

$str1 = 0 . "abc" ;
# ^ результат - "abc", число ноль преобразуется в пустую строку
$int1 = "aaa" + 1 ;
# ^ результат - 1, в строке "aaa" нет цифр
$int2 = "12aaa" + 1 ;
# ^ результат - 13, учитываются только первые цифры строки

Кстати, для объявления длинных строк существуют специальные операторы — q и qq:

# аналогично одинарным кавычкам
$text = q {
Do you have $15 ?
} ;
# аналогично двойным кавычкам
$message = qq {
Hello, $username !
How are you?
} ;

Работа с массивами происходит следующим образом:

#!/usr/bin/perl

$scalar = "bebebebe" ;
($a , $b ) = (1 , 2 ) ; # тоже самое, что $a = 1; $b = 2;
@arr = ("aaa" , 123 , $scalar , $a + $b ) ;
print $arr [ 1 ] . "\n " ;
push @arr , $a ;
print pop (@arr ) . "\n " ;

Здесь мы создаем массив @arr, состоящий из 4-х элементов (строка 5). Затем выводим второй элемент (строка 6). Нумерация элементов начинается с нуля, поэтому для вывода второго по счету элемента используется индекс 1. Затем кладем в конец массива значение переменной $a (функция push, строка 7), и тут же извлекаем и выводим его (функция pop, строка 8).

Обратите внимание, имена массивов начинаются с «собаки», а не доллара (запомнить не сложно — соответствующие символы похожи на первые буквы английских названий типов: $ — scalar, @ — array). При обращении ко второму элементу массива (строка 6) использовался знак доллара, потому что элемент массива является скаляром. По началу это вызывает много путаницы, но вообще все логично.

Еще в этом скрипте мы вызываем функции print и push без скобок. В Perl при вызове функции, везде, где это не вызывает неопределенности, скобки можно опустить.

Для объявления массива, элементами которого являются строки без пробелов, существует специальный оператор — qw:

@arr = qw/aaa bbb ccc/ ;
# аналогично ("aaa", "bbb", "ccc"), только короче

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

#!/usr/bin/perl

%hash = ( # при объявлении хэшей и массивов можно
"x" => 12 , # использовать перенос строк
y => 53 , # если в ключе нет спец-символов, кавычки не нужны
"z" => - 10.5 , # запятую на конце можно оставлять
) ;

$hash { "x" } ++; # координата по x теперь равна 13
$hash { y } --; # координата по y теперь равна 52

# выводим координаты
print "x = $hash{x}, y = $hash{y}, z = $hash{z}\n " ;

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

Кстати, переменные $test, @test и %test — это совершенно независимые друг от друга переменные разного типа.

В этом месте я хотел перейти к условным операторам и циклам for/while, но понял, что для одного поста текста и так уже многовато. Между тем за кадром остались многие вопросы:

  • Условные операторы;
  • Циклы for и while;
  • Объявление функций;
  • Работа с потоками и файлами;
  • Строгий синтаксис;
  • Использование готовых модулей и классов.

Об этом я напишу в одной из следующих заметок. Хотелось бы получить хотя бы парочку комментариев на этот пост — интересно/неинтересно, понятно/непонятно и так далее. Кстати, если у вас есть вопросы, связанные с Perl (не обязательно с этим постом) — смело задавайте их в комментариях!

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



Загрузка...