Создание серверных приложений на языке PERL

         

Почтовые рассылки



Почтовые рассылки

чтобы средствами Perl можно было отсылать почту, необходимо чтобы на сервере была установленна программа "sendmail". Версию под Windows пожно скачать из раздела "Download".

что делаем. Открываем функцией Open программу, и ей на вход подаем нашу почтовую форму:

open (MAIL,"|/usr/lib/sendmail -t"); print MAIL "To: to\@e.mail\n"; print MAIL "From: from\@e.mail\n"; print MAIL "Subject: Subject\n\n"; print MAIL "Body\n"; close MAIL;

Как и HTTP запрос, Email запрос состоит из заголовка и тела. Разберем подробнее заголовок:
To: - Email адрес получателя письма;
From: - Email адрес отправителя;
Subject: - тема.
Как и в HTTP запросе, тело от заголока отделяется пустой строкой.

А Вот форма более продвинутого содержания:

print

В общем, почти то же самое, только информации передается побольше и добавлено поле Cc - адресат скрытой копии.

Еще один интересный код, дает возможность передавать вложенные файлы:

$to = '"Your Name" '; $recip = 'yourname@yourdomain.com'; $from = '"Your Name" '; $subject = "This is the subject"; $mainbody = "This is the main body\n"; $attachment = "This is an attachment\n"; $message = MakeMessage($to, $from, $subject, $mainbody, $attachment); open (MAIL, "|sendmail -t"); print MAIL $message; close (MAIL); sub MakeMessage { # make a composite message containing a main body and one attachment my ($to, $from, $subject, $mainbody, $attachment) = @_; my $message =



Поле для ввода пароля



Поле для ввода пароля

Для этих полей справедливы вышеизложенные утверждения. Создается это поле тегом <input> со значением "pa" пара" параметра "type".

<input type="password" value="default" >



Получение данных методом GET



Получение данных методом GET

Суть метода GET заключается в передаче некоторого объема информации вместе с URL скрипта. Для отделения URL от передаваемой информации используют знак "?" (вопросительный знак). Неплохо бы чисто формально напомнить, что все пробелы заменяются в URL на знак '+', а все специальные и непечатные символы на последовательность %hh ,где hh-шестнадцатиричный код символа. Методом GET можно одновременно передавать несколько значений. Как это делается я расскажу вам позже, а пока будем довольствоваться одним передаваемым значением.

* * * *

Напишем программу, которая выводит квадрат числа, если передаем ей число, или строку, если передаем текстовую строку. Передавать данные следует примерно так: "http://.../cgi-bin/script.pl?256"

#!/usr/bin/perl
print "Content-Type: text/html\n\n";

if ($ENV{'QUERY_STRING'}**2 == 0){print $ENV{'QUERY_STRING'}}
else{print $ENV{'QUERY_STRING'}**2}

И еще одна программка, выводящая некоторые сведения о Вашем сервере:

#!/usr/bin/perl #programm 9 print "Content-Type: text/html\n\n"; @array=($ENV{'SERVER_SOFTWARE'},$ENV{'SERVER_NAME'}); @array=(@array,$ENV{'SCRIPT_FILENAME'},$ENV{'HTTP_USER_AGENT'}); print "<table>"; foreach (@array){ print "<tr><td>$_</td></tr>\n"; } print "</table>"

* * * *

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

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



Правила хорошего тона при разработке CGI программ



Правила хорошего тона при разработке CGI программ

Для начала я расскажу Вам о существовании функции USE.



Прежде чем приступить к занятиям ...



Прежде чем приступить к занятиям...

Прежде чем Вы перейдете к первому уроку, Вы должны немного знать о том как вообще работает Web-сервер и как будут работать Ваши CGI-скрипты (а именно так мы будем называть программы написанные на Perl) на нем. Также Вам потребуется определенное программное обеспечение.

И так, давайте определимся с терминологией.
сервер -компьютер, некоторые ресурсы которого доступны другим компьютерам.
WEB-сервер -компьютер означенный специальным П/О, по средствам которого он способен отдавать HTML документы и результаты работы серверных сценариев другим компьютерам.
В нашем случае серверные сценарии мы будем писать на языке Perl.

Существует такой протокол как HTTP, по средствам которого Web-сервер может получать запросы от браузера и отвечать ему. Когда Вы пытаетесь открыть какую-то страницу, браузер посылает на сервер HTTP запрос, в котором содержится информация о том, что хочет от сервера браузер, данные какого формата он может принять и др. Взамен сервер отсылает браузеру HTTP ответ, состоящий из HTTP заголовка и тела. В HTTP заголовке содержаться сведения о формате передаваемых данных, в теле непосредственно данные (к примеру html файл). По мере изучения курса Вы будете всё больше и больше узнавать о передаваемых данных в заголовках HTTP.
Если сервер получил запрос файла с серверным сценарием, он передаст его соответствующему обработчику, а результат передаст браузеру в теле HTTP.
Значит, чтобы Вы могли запускать perl-скрипты у себя дома (а без этого у Вас просто не получится изучать Perl), Вам потребуется интерпретатор Perl и программа-сервер, которая сможет с ним работать.

Так уж завелось, что большая честь Интернет серверов оснащена программами Apache и работают на платформе Unix, а большая часть пользователей работают на платформе Windows и вообще не имеют программ-серверов. Главная наша задача - максимально приблизиться к условиям настоящих Интернет серверов, от этого зависит качество обучения и в конечном счете качество Ваших Perl-скриптов.

Можно было бы, конечно, установить себе Unix, и работать на "настоящем" web-сервере, но делать это едва ли кто захочет. По этому ограничимся ОС Windows NT. Пойдет всё: NT4/2000/XP. Но если у Вас нет возможности ставить себе такую "роскошь", пойдет и Windows98, только некоторые функции Perl вы не сможете использовать.

Программу-сервер, как Вы уже догадались, я рекомендую Apache. Скачать его можно из раздела "Download-perl". Настройка Apache весьма сложна и требует немало времени и терпения, но результат того стоит! В том же разделе лежит другой HTTP сервер, называющейся SHTTPS (Small HTTP Server). Его главное отличие от Apache - простота настройки. В принципе, сразу после инсталляции он уже готов к работе, нужно только прописать путь к Perl, чтобы он мог выполнять Perl-скрипты.

Дистрибутив Perl я рекомендую качать полный (8 Мб), иначе очень навороченные скрипты (по большей части форумы), которые вы скорее всего будете отлаживать у себя на машине, не смогут работать. Но для изучения Perl пойдет и минимальный дистрибутив (600 Кб).

И так, если у Вас сервер Apache с полным дистрибутивом Perl установлены на Windows 2000, Вы в полной мере сможете ощутить ВСЮ мощ CGI-программинга!
Напротив, если вы установите SHTTPS с минимальным дистрибутивом Perl под Windows 95, Этого едва ли хватит для первоначального знакомства с Perl.

Если Вы уже установили сервер и Perl, можете приступать к первому уроку. Если еще нет, раздел "Help" поможет Вам установить и настроить сервера.

Желаю удачи!

Дополнительная информация: [подробнее об HTTP протоколе]



A Форматы MIME Работа



Приложение A.
Форматы MIME. Работа с почтой.
Дополнительные поля HTTP заголовка; работа с Cookie

Простые поля для ввода



Простые поля для ввода

Простое поле для ввода создается тегом <input>, но в отличае от кнопок, значение атрибута "type" должно быть "text". У простого поле для ввода есть дополнительные параметры и атрибуты:

name идентификатор данного поля
size длина поля в символах
title текст всплывающей подсказки
value значение поля по умолчанию
maxlength максимально возможное количество вводимых символов
disabled этот атрибут не дает изменить значение по умолчанию

Как это работает: при отправке формы, значение каждого поля будет являться значением параметра, а имя поля - именем параметра. Именно поэтому необходимо каждому полю присваивать какое-нибудь имя.

<input type="text" size="15" title="обычное поле" maxlength="20" value="some text here" >



Прототипы



Прототипы

Для краткого описания типа передаваемых подпрограмме параметров можно применять прототипы. Если формат передаваемых данных не будет удовлетворять шаблону прототипа, это вызовет ошибку программы. В Perl существуют следующие прототипы:

Декларация Пример вызова
sub mylink($$) mylink $old, $new
sub myvec($$$) myvec $var, $offset, 1
sub myindex($$;$) myindex &getstring, "substr"
sub myreverse(@) myreverse $a, $b, $c
sub myjoin($@) myjoin ":",$a,$b,$c
sub mypop(\@) mypop @array
sub mysplice(\@$$@) mysplice @array, @array, 0, @pushme
sub mykeys(\%) mykeys %{$hashref}
sub myopen(*;$) myopen HANDLE, $name
sub mypipe(**) mypipe READHANDLE, WRITEHANDLE
sub mygrep(&@) mygrep { /foo/ } $a, $b, $c
sub myrand($) myrand 42
sub mytime() mytime

Здесь:

\'символ' - параметр с типом 'символ' '@' или '%' - все оставшиеся параметры как список '$' - скаляр '&' - безымянная подпрограмма '*' - ссылка на таблицу имен ';' - разграничитель обязательных и не обязательных параметров.

Вставить часть CGI кода в программу, подобно SSI, можно с помощью функции "require". Её синтаксис прост до безобразия:

require "файл";

Пример кода, где подпрограмма загружается из внешнего файла:

# Файл sub.pl sub summ($$){ return ($_[0]+$_[1]) } # Файл со скриптом require "sub.pl"; print summ(5,2);

* * * *

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

sub fact{ # объявляем функцию fact my($sum,$i); # объявляем локальные переменные $sum=1; for ($i=1;$i<=$_[0];$i++){ $sum*=$i; } return $sum # возвращаем значение переменной $sum }

Примеры вызова такой функции:

print fact(4);
print fact(4,22.8,5);

Результатом выполнения этого кода будет 24 Чтобы избежать вызова функции с ошибочными значениями, используем прототип $, означающий, что функции мы передаем только один парамер:

sub fact($){ my($sum,$i); $sum=1; for ($i=1;$i

Перепишем программу 13 с учетом полученных знаний:

#!/usr/bin/perl # programm 17 print "Content-type: text/html\n\n"; &parse_form; sub wiev(){ open(file,"file.txt"); @array=; close file; foreach $i(@array){ $u++; print "$u. $i
"; }} print
Добавить запись
Удалить запись номер:
END ; if ($FORM{'action'} eq "add") { open(file,">>file.txt"); print file "$FORM{'string'}\n"; close file; wiev; } elsif ($FORM{'action'} eq "del") { open(file,"file.txt"); @array=; close file; open(file,">file.txt"); $size=@array; for($i=0;$i wiev } else{wiev}

Не правда ли, ощутимая разница?

* * * *

В какую переменную поместится 2-й переданный процедуре параметр? Сколько параметров может принять эта процедура - sub overlay(@); ?

Перепишите 3-4 написанные Вами программы с целью ввести туда процедуры.



Путь к файлу



Путь к файлу

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

D:/USR/LOCAL/APACHE |----> CGI-BIN | |----> MYDIR | | |----> file0.txt | | | |----> script.pl | |----> file1.txt | |----> HTDOCS |----> file2.txt

Тогда абсолютные пути к файлам будем иметь такими:

D:/USR/LOCAL/APACHE/CGI-BIN/MYDIR/file0.txt D:/USR/LOCAL/APACHE/CGI-BIN/file1.txt D:/USR/LOCAL/APACHE/CGI-BIN/script.pl D:/USR/LOCAL/APACHE/HTDOCS/file3.txt

А относительно файла script.pl, пути будут такими:

MYDIR/file0.txt file1.txt ../HTDOCS/file2.txt

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



Работа с Cookie



Работа с Cookie

(отрывок из статьи "Что такое Cookies и с чем их едят")

Что такое cookie?

Cookie является решением одной из наследственных проблем HTTP спецификации. Эта проблема заключается в непостоянстве соединения между клиентом и сервером, как при FTP или Telnet сессии, т.е. для каждого документа (или файла) при передаче по HTTP протоколу посылается отдельный запрос. Включение cookie в HTTP протокол дало частичное решение этой проблемы.

Cookie это небольшая порция информации, которую сервер передает клиенту. Клиент (броузер) будет хранить эту информацию и передавать ее серверу с каждым запросом как часть HTTP заголовка. Некоторые cookie хранятся только в течение одной сессии, они удаляются после закрытия броузера. Другие, установленные на некоторый период времени, записываются в файл. Обычно этот файл называется 'cookie.txt'.

Что можно делать с помощью cookie?

Сами по себе cookies не могут делать ничего, это только лишь некоторая информация. Однако, сервер может на содержащуюся в cookies информацию. Например, в случае авторизованного доступа к чему либо через WWW, в cookies сохраняется login и password в течение сессии, что позволяет не вводить их при запросе каждого запаролированного документа. Другой пример: cookies могут использоваться для построения персонализированных страниц. Чаще всего встречается такое - на некотором сервере Вас просят ввести свое имя, и каждый раз, когда Вы заходите на первую страницу этого сервера, Вам пишут что-то типа "Hello, your_name!". На использовании cookies также часто строят функцию оформления заказа в онлайновых магазинах, в частности, в Амазоне, такая своеобразная виртуальная корзина покупателя, как в обычном реальном супермаркете.

У Cookies есть 2 основных параметра: содержание и время жизни, по истечении которого Cookies не передаются серверу. Чтобы с помощью CGI установить Cookies, нужно добавить в HTTP заголовок строку такого вида:

Set-Cookie: key=value; expires=date;

[key=value] - тело;
[date] -время жизни.

Время жизни представляет собой критическую дату, после которой Cookies считается не действительным. Она указывается весьма своеобразным способом:

Set-Cookie: Name=CowBoy; expires=Fri, 31-Dec-02 23:59:59 GMT;

Это значит, что Cookies будут жить только до 31 декабря 2002 года.

Один документ может содержать несколько Cookies. Код ниже формирует HTTP заголовок с установкой Cookies:

print "Content-Type: text/html\n"; print "Status: 200 Ok\n"; print "Set-Cookie: name=Robert; expires=Sat, 26-Aug-03 15:45:30 GMT;\n"; print "Set-Cookie: nick=Pauls; expires=Sat, 26-Aug-03 15:45:30 GMT;\n\n";

Чтобы автоматизировать процесс выставления Cookies, написана процедура set_cookie. Она принимает 3 параметра: время жизни в часах, ключ, значение.

sub set_cookie($$$){ my($year,$date,@day,$ret,$time); $time=time+($_[0]*3600); $year=(localtime($time))[5]; $date=localtime($time); @day=split(/ /,$date); $year =~ s/\d*(\d\d)/$1/; $ret="Set-Cookie: $_[1]=$_[2]; expires="; $ret.="$day[0], $day[2]-$day[1]-$year $day[3] GMT;"; return $ret }

Посмотрите как просто с помощью неё устанавливать Cookies:

print set_cookie(10,"name","Robert"),"\n"; print set_cookie(10,"nick","Pauls"),"\n\n"; sub set_cookie($$$){ my($year,$date,@day,$ret,$time); $time=time+($_[0]*3600); $year=(localtime($time))[5]; $date=localtime($time); $date =~ s/ +/ /g; @day=split(/ /,$date); $year =~ s/\d*(\d\d)/$1/; $ret="Set-Cookie: $_[1]=$_[2]; expires="; $ret.="$day[0], $day[2]-$day[1]-$year $day[3] GMT;"; return $ret }

Чтение ранее записанных значений Cookies производится из переменной окружения $ENV{'HTTP_COOKIE'}. Для удобства получения данных написана процедура get_cookie.

sub get_cookie{ my (@coo_pairs,$pair,$name,$value); @coo_pairs = split(/; /, $ENV{'HTTP_COOKIE'}); foreach $pair (@coo_pairs) { ($name, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg; $COOKIE{$name} = $value;} }

Она создает хеш %COOKIE, в котором данные представлены в виде ключ-значения.

В Cookies можно хранить только символы латинского алфавита, символы нижнего подчеркивания, цифры и знаки % (процент). Обычно такого набора символов хватает для хранения служебной информации.
Чтобы в Cookies можно было хранить все символы таблицы ASCII, доработаем функции передачи следующим образом: будем передавать не сам символ, а его номер в таблице. Для разделения символов будем использовать символ "%". Анологичным образом поступим с функцией приема Cookies, только она будет дешифрировать наши последовательности.

Скрипт ниже создает и считывает значения из Cookies. Все функции модифицированны:

#!/usr/bin/perl print "Content-Type: text/html\n"; print &set_cookie(1,"name","Robert"),"\n"; print &set_cookie(1,"nick","Pauls"),"\n\n"; my ($COOKIE); sub set_cookie($$$){ my($year,$date,@day,$ret,$time,$word); $time=time+($_[0]*3600); $year=(localtime($time))[5]; $date=localtime($time); $date =~ s/ +/ /g; @day=split(/ /,$date); $year =~ s/\d*(\d\d)/$1/; $word=$_[2]; $word =~ s/(.)/"%".ord($1)/eg; $ret="Set-Cookie: $_[1]=$word; expires="; $ret.="$day[0], $day[2]-$day[1]-$year $day[3] GMT;"; return $ret } sub get_cookie{ my (@coo_pairs,$pair,$name,$value); @coo_pairs = split(/; /, $ENV{'HTTP_COOKIE'}); foreach $pair (@coo_pairs) { ($name, $value) = split(/=/, $pair); $value =~ s/%(\d+)/chr($1)/eg; $COOKIE{$name} = $value;} } get_cookie; print $COOKIE{'name'},"
"; print $COOKIE{'nick'};

Радиокнопка



Радио-кнопка

В отличие от checkbox, может быть несколько радио кнопок с одинаковым параметром name ,но с разными value, из них передается только та, что выбрана. Одна из них может быть изначально выбрана по умолчанию.

<input type="radio" value="v1" name="r1"><input type="radio" checked value="v2" name="r1">



Скрытое поле



Скрытое поле

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

<input type="hidden" value="1" name="okay">



Создание серверных приложений



Создание серверных приложений на языке PERL
Ускоренный учебный курс
Содержание

[урок 1]  Создание и запуск Perl-скриптов, оператор Print.
[урок 2]  Типы данных в Perl, переменные, одинарные и двойные кавычки.
[урок 3]  Операции с числами и строками, логические выражения.
[урок 4]  Составной и условный операторы.
[урок 5]  Операторы повторения с заданным количеством итераций.
[урок 6]  Операторы повторения с неизвестным заранее количеством итераций.
[урок 7]  Метки, оператор перехода, операторы управления циклами.
[урок 8]  Список. Массив. Работа с массивом.
[урок 9]  Метасимволы.
[урок 10]  Встроенные переменные, получение данных методом GET.
[урок 11]  HTML формы, функция ParseForm, метод POST.
[урок 12]  Оператор Print, хеши.
[урок 13]  Функции работы с файлами.
[урок 14]  Функции для работы с файлами (продолжение).
[урок 15]  Функции для работы с файлами (продолжение).
[урок 16]  коротко о SSI.
[урок 17]  Подпрограммы, прототипы.
[урок 18]  Работа с числами.
[урок 19]  Функции для работы со строками.
[урок 20]  Операторы для работы со строками (продолжение).
[урок 21]  Регулярные выражения.
[урок 22]  Операторы поиска и замены.
[урок 23]  Еще немного о циклах.
[урок 24]  Функции для работы с массивами.
[урок 25]  Функции для работы с хешами.
[урок 26]  Дата и время.
[урок 27]  Функции для работы с директориями.
[урок 28]  Прочие функции.
[приложение A]  Форматы MIME. Работа с почтой. Дополнительные поля HTTP заголовка; работа с Cookie.
[приложение Б]  Возможные ответы на задания для самостоятельного выполнения.
[приложение В]  Примеры скриптов, выполненных на языке Perl



Создание серверных приложений на языке PERL
Ускоренный учебный курс
Off-line plus версия

Автор: Cleric ICN
Дата последнего изменения: 04.12.02 18:21

Это учебное пособие написано для того чтобы помочь Вам самостоятельно изучить язык Perl и представляет собой своего рода выжимку из многих электронных и бумажных изданий подобного рода. Пройдя его Вы изучите все необходимые для разработки собственных приложений операторы и функции, узнаете об их специфических особенностях. В рамках этого курса мы будем рассматривать Perl только как язык написания CGI-сценариев.
Чтобы ускоренное изучение Perl не вызывало у Вас никаких затруднений, Вы должны обладать определенным набором знаний в области создания HTML документов. Вы должны хорошо знать HTML тэги, работать с таблицами и каскадными таблицами стилей (CSS). Помимо этого вы должны иметь хотя бы начальные знания в области языков программирования высокого уровня (Pascal, Basic, Delphi, C, JavaScript и т.д.). А если Вы уже знаете PHP, то получите ни с чем не сравнимое удовольствие от изучения Perl по ускоренному курсу.

И так, с чем же Вы будете иметь дело?! Весь курс разбит на 28 уроков, пройдя которые Вы изучите 114 операторов и встроенных функций.
В свою очередь каждый урок разбит на 3 части:
1-я часть - теоретическая. В ней будет даваться теоретический материал по теме урока.
2-я часть - практическая. В ней будет дан пример CGI-приложения выполненного с применением знаний, полученных в этом и предыдущих уроках.
3-я часть - задания для самостоятельного выполнения. В конце каждого урока я буду давать Вам несколько "домашних заданий" для закрепления полученных знаний.
Психологами установлено, что учеба проходит гораздо быстрее, эффективнее и интереснее, если есть какая-то видимая конечная цель (стимул), к которой нужно стремиться. Полное изучение Pelrl не может быть в данном случает стимулом, т.к. знания не вещественны. Стимулом этого курса будет создание скрипта гостевой книги.

В период изучения Perl у вас могут возникать вопросы по некоторым темам, это характерно для любого человека. Важно быстро получить качественный ответ. Сделать это не всегда просто, ведь Вы часто не имеете возможность задать свой вопрос знающему человеку. Чтобы попробовать самостоятельно разобраться со своим вопросом, в разделе "Help" выложены 2 полных справочника по "чистому" Perl и "Учебное пособие по CGI-программированию от Леши", которое будет являться памяткой для Вас. И помните, Вы ВСЕГДА можете обратится со своими вопросами к автору курса по E-mail.

Если у Вас Всё готово, можете переходить к организационному разделу.





Создание серверных приложений на языке PERL
Ускоренный учебный курс



Список



Список

Задает список, позволяющий выбрать одну (или несколько) опций из списка. Его значение всегда передается, т.к. всегда хотя бы одно выбрано.
Список создается тегом <select>. Его синтаксис таков:

<SELECT name="s1">
<OPTION value="value1">Опция 1
<OPTION value="value2">Опция 2
.....
<OPTION value="valueN">Опция N
</SELECT>

У тега <SELECT> есть дополнительные параматрибутытребу ты:

name имя списка
size кол-во отображаемых пунктов
multiple этот атрибут позволяет выделять несколько пунктов списка
selected этот атрибут тега <option> указывает выбранный по умолчанию пункт
<select name="sel">
<option value="1">один
<option value="2" selected>два
<option value="3">три
</select>
один два три


Ссылки на полезные сайты



Ссылки на полезные сайты

srv.mf.inc.ruСайт самого маленького HTTP сервера под Windows. Его дистрибутив не превышает 150 Кб.
www.apache.orgСайт самого мощного WEB-сервера. От туда всегда можно скачать последнюю версию.
designerweb.dax.ruСайт человека, который побудил меня написать это учебное пособие.
pgbook.dax.ruБез комментариев...
wallst.ruСамый лучший бесплатный WEB-сервер:
-поддержка Perl,PHP,MySql,SSI
-поддержка Sendmail
-неограниченное дисковое пространство
-быстрый канал
cgi.proext.comЕще одна скриптовая коллекция
cgi.myweb.ruОгромная коллекция CGI скриптов.
kormushka.ruСайт всецело посвящен Web-дизайну и языкам программирования для WEB.
webscript.ruСайт полностью посвящен языкам программирования для WEB.
На сайте можно найти статьи, учебники по Perl, а также готовые Perl-скрипты.
www.perl.ruСайт полностью посвящен языку Perl. На нем работает форум, где Вы всегда можете задать свой вопрос и быстро получить на него ответ.


Создание и запуск PerlскриптовОператор Print



Урок 1. Создание и запуск Perl-скриптов
Оператор Print

Как и везде, первый наш урок очень важен для всего последующего обучения. Сегодня Вы узнаете много полезной и важной информации о CGI программировании. Начнем с того, что все свои программы Вы будете набирать не в интегрированной среде, как Вы привыкли в Pascal или C, а в текстовом редакторе. Подойдет и notepad. Это связано не с тем, что для Perl нет подобных сред, а с тем, что это благотворно скажется на усвоении материала, это сдисциплинирует Вас. Когда Вы уже будете вполне хорошо знать Perl, можете воспользоваться специальным редактором, который выложен в разделе "Download".
Вот основные постулаты по CGI программированию, которые необходимо запомнить: Свою программу Вы будете сохранять в специальную папку на сервере, которая называется CGI-BIN, т.к. только из неё разрешен ЗАПУСК сценариев. Если Вы сохраните файл в другую папку, сервер передаст браузеру исходный код Вашей программы, а не результат выполнения. Расширение у CGI файлов должно быть .pl (к примеру, example.pl). Как и во всех языках программирования, в Perl есть т.н. комментарии. Для справки: комментарии это такие строки, которые не обрабатываются интерпретатором. В Perl строка считается закомментированной, если перед ней стоит знак "#". Действие знака комментария распространяется до конца текущей строки. Любая CGI программа требует ПОЛНЫЙ путь к интерпретатору Perl в её первой строке. Сервер не запустит CGI программу, если в ней не указан тип выводимых данных (пока мы ничего не выводим кроме обычного html).

Чтобы вывести данные, в Perl предусмотрен оператор Print. Его синтаксис таков:
print (значение);
print значение;
После каждого оператора должна стоять точка с запятой! Хотя это характерно почти для всех языков программирования, почему-то больше всего ошибок возникает именно из-за отсутствия этого непритязательного знака препинания в конце каждого оператора.

* * * *

Ну, наверное хватит с Вас теории, займемся практикой.

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

#!/usr/bin/perl
print "Content-Type: text/html\n\n";

print "Мир дому твоему!";

Позвольте я прокомментирую. Первая строка - путь к Perl. Без этого сервер не сможет вызвать Perl-интерпретатор.
Вторая строка - печатаем строку "Content-Type: text/html". Это нужно для формирования заголовка HTML, и она гласит, что мы пытаемся передать данные в формате text/html. Форматов данных очень много, поговорим об этом подробнее в следующих уроках, а пока нужно усвоить, что передаем мы браузеру данные именно в таком формате.
Третья строка - пустая.
Четвертая строка - вывод строки "Мир дому твоему!".
Теперь перепечатайте всё это в текстовый редактор и сохраните под каким-нибудь именем на сервере. Готово? Тогда открывайте браузер и вводите URL к скрипту. Это будет выглядеть примерно так: "http://localhost/cgi-bin/test.pl". Разумеется, сервер должен работать, ниаче ничего не откроется. Увидели строчку на экране? Или увидели их аж 10 ;-) ? Если Вы всё правильно набрали, ошибок возникнуть не должно. В разделе "Help" есть небольшое руководство по поиску и устранению ошибок.
Теперь нажмите правой кнопкой мыши на рабочем поле браузера и выберите пункт "Просмотр HTML кода". Откроется Notepad, где будет содержаться именно то, что передал Perl серверу, а он в свою очередь браузеру. Запомните эту процедуру, т.к. Вы будете пользоваться ей довольно часто.

* * * *

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

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

Дополнительная информация: [введение в Perl]



Типы данных в Perl переменные



Урок 2. Типы данных в Perl, переменные, одинарные и двойные кавычки

Perl - не типизированный язык программирования, в отличие от Pascal или C (хотя очень похож на последний). В Perl есть 3 основных типа переменных: скаляры, массивы и хеши (ассоциативные массивы). Сегодня подробно разберем первый из типов.

Perl не требует обязательного объявления переменных. Переменная автоматически определяется как только встретилась в контексте. Т.к. Perl не типизированный язык, для него нет таких понятий как строковая переменная, числовая, байтовая и т.д. Это отрадно!
В зависимости от контекста, её содержимое автоматически конвертируется в числовое или текстовое.
Помимо этого скаляр может иметь и логическое значение True или False (Истина или Ложь). Если скаляр НЕ равен 0 или пустой строке, он имеет логическое True. В противном случае - False.

Обычная скалярная переменная начинается со спец. символа $, её имя должно начинаться только с латинской буквы или символа нижнего подчеркивания. В состав имени переменной могут входить также и цифры. Регистр букв тоже важен. К примеру $Var1 и $var1 это разные переменные.

Для присваивания переменной какого-то значения, служит знак присваивания. Как и в Basic, это символ равенства: "=". Работает он также как и в остальных языках, по этому не требует описания.

Чтобы присвоить переменной текстовую строку, её заключают в кавычки. Perl допускает применение как одинарных ('), так и двойных (") кавычек. Разница лишь в том, что в двойных кавычках переменные интерполируются (подставляются значения переменных), а в одинарных - нет. Для присваивания переменным числовых значений кавычек не требуется.

* * * *

Теперь давайте вспомним предыдущий наш урок. Попробуем модернизировать нашу программу с учетом полученных сегодня знаний. Изначально она выглядела таким образом:

#!/usr/bin/perl
print "Content-Type: text/html\n\n";

print "Мир дому твоему!";

Присвоим строку "Мир дому твоему!" какой-нибудь переменной, и будем выводить её значение. Программа получится следующей:

#!/usr/bin/perl
#programm 1
print "Content-Type: text/html\n\n";

$message = "Мир дому твоему!";
print "$message";

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

#!/usr/bin/perl
#programm 2
print "Content-Type: text/html\n\n";

$var1 = 16;
$var2 = "$var1 овец";
print 'Значение переменной $var1: ';
print "$var1<br>";
print 'Значение переменной $var2: ';
print "$var2";

Небольшой комментарий. Сначала мы присваиваем число 16 переменной $var1. Как было сказано ранее, числа не нужно обрамлять кавычками.
Следующая строка требует объяснения. Т.к. кавычки у нас стоят двойные, переменные в них интерполируются. Таким образом переменной $var2 мы присваиваем строку "16 овец".
Далее выводим строку "Значение переменной $var1: ". Т.к. кавычки стояли одинарные, переменная не интерполируется.
Затем выводим значение переменной $var1 и добавляем HTML тег "<BR>" для переноса текста на следующую строку. Далее ситуация повторяется.

* * * *

Ответьте на вопросы:

Какие символы может содержать название переменной? Когда обычная скалярная переменная имеет логическое "Ложь"? Какие из ниже приведенных переменных написаны неправильно или используются неправильно? Объясните, почему Вы так считаете? $Var1="256"; $Var2="33.2"; $Var3='Var1, '; $_Var=some text here; $_var=some text here; $_var='some text here'; $-var="some text here";

Операции с числами и строками логические выражения



Урок 3. Операции с числами и строками, логические выражения

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

++ - инкремент $a ++;      # $a = $a + 1
-- - дикремент $a --;      # $a = $a - 1
** - возведение в степень $a = 2**10; # $a = 1024
* - умножение $a = 5 * 6; # $a = 30
/ - деление $a = 5 / 2; # $a = 2.5
% - получение остатка от деления  $a = 5 % 2; # $a = 1
+ - сложение $a = 5 + 5; # $a = 10
- - вычитание $a = 2 - 5; # $a = -3
Приоритеты распределены в порядке убывания сверху вниз. Как видите, всё как в математике.

Операции над строками.

. конкатенация   $a = "abc"."123"; # $a = "abc123"

Как видите, операторов работы со строками немного меньше ;-) .

Для удобства оперирования с одним операндом, придуман оператор "X=", где X может принимать значение любого из вышеперечисленного операторов. Как это работает: $a .= 5, тоже самое что и $a = $a . 5;
$u += 8, тоже самое что и $u = $u + 8 и т.д.

Логические операторы позволяют проверить на истинность некоторое условие или совокупность условий. Если условие истинно, оператор возвращает True, если ложно - False.

< меньше $a = 5 < 2;  # $a = False
> больше $a = 5 > 2;  # $a = True
== равно $a = 3 == 3; # $a = True
<= меньше или равно $a = 4 <= 8; # $a = True
>= больше или равно $a = 4 >= 8; # $a = False
!= не равно $a = 5 != 5; # $a = False
lt строковое меньше $a = "11" lt "a"; # $a = True
gt строковое больше $a = "11" gt "a"; # $a = False
eq строковое равно $a = "o" eq "o";  # $a = True
ne строковое не равно $a = "o" ne "o";  # $a = False
le строковое меньше или равно $a = "11" le "a"; # $a = True
ge строковое больше или равно $a = "11" ge "a"; # $a = False

Таблицы истинности операторов AND, OR и XOR. В них показано что возвращает логический оператор в зависимости от значений сравниваемых выражений

AND OR XOR
True True True True True True False True True
False False True True True Flase True True Flase
False True False True False True True False True
False False False False False False False False False

* * * *

Программа, демонстрирующая работу условных операторов. #!/usr/bin/perl #programm 3 print "Content-Type: text/html\n\n"; $var1 = 5; $var2 = 3; $a=(($var1 > $var2) and ($var1 != $var2)); print $a;

Работает она следующем образом: сначала вычисляются логические выражения в скобках, затем сравниваются между собой. Оба выражения истины. Из таблицы истинности видно: если оба выражения истины, логический оператор AND возвращает True, что и выведется нам на экран.

Несколько слов о преобразовании строк в числа и обратно.
Если строковое значение используется как операнд в операции с числами (например, в операции сложения), Perl автоматически преобразует эту строку в эквивалентное числовое значение, как если бы оно было введено в виде десятичного числа с плавающей запятой. Нечисловые окончания и начальные пробельные символы игнорируются, поэтому " 123. 4 5 fed" (с начальным пробелом) без какого-либо предупреждения преобразуется в "123. 45". Самый крайний из подобных случаев — когда нечто, не являющееся числом, вообще без предупреждения преобразуется в нуль (как строка fed, которую мы использовали здесь как число).

Если же, наоборот, там, где должно быть строковое значение, вводится числовое (например, в операции конкатенации строк), это числовое значение конвертируется в строку, которая была бы выведена на экран вместо него. Например, если вы хотите конкатенировать строку х с результатом умножения 4 на 5, это можно записать как

"X" .(4*5); # то же самое, что "X" . 20, или "Х20"

(Помните, что круглые скобки заставляют сначала выполнить 4*5, а затем выполнять операцию конкатенации.)

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

* * * *

Попробуйте по памяти переписать таблицы истинности для каждого из операторов (AND, OR, XOR).

Напмшите программу, которая выводит значения 3-х переменных в четвертую таким образом, чтобы значение 3-й переменной стояло сразу за начением 2-й, а значение 2-й - за первым.



Составной и условный операторы



Урок 4. Составной и условный операторы

Блок операторов — это последовательность операторов, заключенная в парные фигурные скобки. Блок операторов выглядит следующим образом: { оператор 1; оператор 2; оператор 3; ..... оператор n; }

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

Условный оператор IF

IF (EXPR){operator} IF (EXPR){operator} else {operator1} IF (EXPR){operator} elsif (EXPR2){operator2} ... else{operator3} {operator} IF (EXPR)

Условный оператор позволяет проверять некоторое условие и в зависимости от результатов проверки выполнять то или иное действие. Таким образом, условный оператор - это средство позволяющее ветвись вычислительный процесс. Условный оператор работает по следующему алгоритму: Вначале вычисляется условное выражение EXPR. Если оно истинно, выполняется блок "operator" и программа выполняется дальше. Если EXPR ложное, проверяется условие EXPR2. Если оно истинное, выполняется блок "operator2" и программа выполняется дальше, иначе выполняется блок operator3. Примечание: проверяемых условий может быть сколько угодно. С помощью этого свойства оператора IF можно реализовывать многочисленное ветвление программы.

Оператор Unless

Unless имеет такой же синтаксис как и IF, но отличается от него тем, что блоки выполняются не при истинных значениях условий, а при ложных.

* * * *

Следующая программа демонстрирует работу оператора IF в сокращенной форме:

#!/usr/bin/perl #programm 4 print "Content-Type: text/html\n\n"; $var = 23; if ($var%2){$mess="не четное"}else{$mess="четное"} print "$var -$mess число";

Как работает оператор IF в этой программе:
Как Вы помнете, выражение принимает значение True если оно не равно 0 или пустой строке. Наличие остатка от деления на 2 является признаком его нечетности. Значит если есть остаток, выражение истинно, и выполняется первый блок. Если остатка нет, значение ложно и выполняется второй блок.

* * * *

Напишите программу, которая сообщает о состоянии воды при различных температурах (счисление по Кельвину). Температуру задайте в переменной $temperature. Сделайте проверки на непригодные значения (температура по K никогда не бывает отрицательной.)

Ответьте на вопросы: Посчитается ли ошибкой, если после последнего оператора программы не стоит точка с запятой? О чем это говорит? Как продолжет свое выполнение программа, если ни одно из условий следующей конструкции не будет истинно: IF (EXPR){operator} elsif (EXPR2){operator2} ?

Перепишите программу 4, чтобы вместо оператора IF использовался оператор Unless.

Дополнительная информация: [Управляющие структуры ] [Управляющие структуры 2 ]



Операторы повторения с заданным количеством итераций



Урок 5. Операторы повторения с заданным количеством итераций

Операторы повторения (формирования циклов) служат для программирования циклически повторяющегося участка кода.

Оператор X

operator x (кол-во итераций);

x - оператор позволяющий выполнить строго заданное кол-во раз только один оператор.

Оператор FOR

for (EXPR1; EXPR2; EXPR3) {operator}

Работа оператора FOR в Perl аналогична работе его в C и JavaScript:
Сначала вычисляется выражение EXPR1. Оно содержит в себе переменную цикла. Затем вычисляется EXPR2. Если его значение True, выполняется блок операторов. Иначе цикл завершается и программа выполняется дальше. После выполнения блока операторов вычисляется выражение EXPR3, затем EXPR2. Если его значение True, выполняется блок операторов. Иначе цикл завершается. И так далее до того как EXPR2 не станет False.

* * * *

Простейшая программа, демонстрирующая работу оператора FOR.

#!/usr/bin/perl #programm 5 print "Content-Type: text/html\n\n"; for($i=0;$i

аргумент цикла читается следующем образом: "переменной $i присваиваем значение 0. Выполнять цикл пока $i меньше или равна 1000. Каждую итерацию $i инкрементировать". Эта программа вываливает на экран все числа начиная с 0 и заканчивая 1000.

Теперь поставим пере собой задачу вывести таблицу Пифагора в окно браузера. Диапазон чисел по оси X и Y совпадает и равен 2..9.

#!/usr/bin/perl #programm 6 print "Content-Type: text/html\n\n"; print '<font face="courier new">'; for($i=1;$i<=9;$i++){ for($u=1;$u<=9;$u++){ if(($u*$i)/10 < 1){print"&nbsp;"} unless($u*$i==1){print $u*$i}else{print"&nbsp;"} print "&nbsp;"; } print"<br>"; } print '</font>';

Разберем как эта программа работает.
Выводим строку "<font face="courier new">". Этим мы выбираем тип шрифта, каким будут выводиться данные.
Начинаем новый цикл, в котором переменная $i изменяется от 1 до 9.
В него "вкладываем" еще один цикл, в котором переменная $u также изменяется от 1 до 9.
Проверяем условие: если произведение переменных циклов, деленных на 10 меньше единицы, выводим пустой символ (пробел), иначе ничего не делаем. Такая хитрая операция нужна для того чтобы все числа таблицы Пифагора имели одинаковые знакоместа. Это позволит построить правильно организованную таблицу.
Проверяем условие: если произведение переменных массивов не равно единице выводим их произведение, иначе выводим пустой символ. Эта операция нужна чтобы исключить единицу из наших осей таблицы.
Затем выводим пустой символ. Это нужно чтобы удалить столбцы таблицы друг от друга на один символ.
Когда внутренний цикл закончит выполняться, закончится и вывод первой строки. Выполнится вывод тэга переноса строки и внутренний цикл снова начнет выполняться но уже с другим значением переменной $i.
Когда внешний цикл отработает все 9 итераций, а внутренний 81-у итерацию, будет сделан вывод закрывающего тега font и программа успешно завершит свое выполнение, оставив на экране браузера так всеми ненавистную таблицу Пифагора.

* * * *

Модернизируйте программу таким образом, чтобы таблица Пифагора выводилась в виде HTML таблицы.

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

Как поведет себя цикл FOR, если в его теле изменять переменную цикла так, чтобы условия цикла всегда было истинно?

Дополнительная информация: [Управляющие структуры ] [Управляющие структуры 2 ]



Операторы повторения с



Урок 6. Операторы повторения с неизвестным заранее количеством итераций

Оператор WHILE

while (EXPR) {operator1} continue {operator2}

Цикл while выполняет operator1 до тех пор пока EXPR = true. Блок после continue выполняется всегда перед тем как вычисляется логическое выражение EXPR. Это подобно EXPR3 в предложении for, поэтому в этом блоке удобно изменять счетчики и флаги цикла.

Оператор Until

Этот оператор по синтаксису ничем не отличается от While, но работает пока EXPR = False.



Метки оператор перехода операторы управления циклами



Урок 7. Метки, оператор перехода, операторы управления циклами

Список Массив Работа с массивом



Урок 8. Список. Массив. Работа с массивом

Список — это упорядоченные скалярные данные. Массив - переменная, которая содержит список. Каждый элемент массива — это отдельная скалярная переменная с независимым скалярным значением.

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

Список состоит из значений, отделенных друг от друга запятыми и заключенными в круглые скобки. Эти значения образуют элементы списка.
(1,2,perl,3.14159) - список из 4-х значений.
Элементы списка не обязательно должны быть константами. Это могут быть выражения, которые вычисляются при каждом использовании списка. Например:
($a,$a**$b,$b+33) -список из 3-х элементов.

Список можно присвоить особому типу переменных - массиву. Такая переменная начинается с символа "@", а не "$" как обычная скалярная переменная. Обращение к элементам массива идет через индекс массива. Каждому элементу массива соответствует скалярная переменная с именем массива.
Пора Вам рассказать о том, что оператор print способен выводить не только скалярные данные, но и списки. Приведенная ниже программа демонстрирует работу с массивом.

#!/usr/bin/perl print "Content-Type: text/html\n\n"; @ar=(1,2,3); $ar[0]++; print @ar,"<BR>"; print $ar[0],$ar[1],$ar[2];

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

#!/usr/bin/perl print "Content-Type: text/html\n\n"; @array=(0,2,4.5,Perl); $ar=@array; $ar1=(0,2,4.5,Perl); print @array,"<br>"; print $ar,"<br>"; print $ar1,"<br>"

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

#!/usr/bin/perl print "Content-Type: text/html\n\n"; $d="22"; @ar=(3,2,1); ($a,$b,$c,$d)=@ar; print ($a,$b,$c,$d,"<BR>"); @ar1=(@ar,"It works!"); print @ar1;

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

#!/usr/bin/perl print "Content-Type: text/html\n\n"; @array=(1,2,3,4); print @array[0,-3];

Метасимволы



Урок 9. Метасимволы

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

И так, что же такое метасимволы? Метасимвол - это особая последовательность символов, которая выполняет роль непечатаемого символа, либо какую-либо другую специфическую роль.
С некоторыми такими символами Вы уже знакомы, это "$", которым мы обозначаем скалярные переменные, и "@", которым обозначаем массив. Другие часто встречающиеся метасимволы приведены в таблице ниже.

\t символ табуляции
\n символ возврата каретки и перевода строки
\b backspace (забой)
\034 восьмеричный символ
\xla шестнадцатеричный символ
\l нижний регистр следующего символа
\u верхний регистр следующего символа

Это не полная таблица, за дополнительным материалом обращайтесь к справочным пособиям.
Давайте подробнее поговорим о метасимволе "\n". Это ни что иное как признак конца строки. К примеру, когда Вы набираете текст в текстовом редакторе и нажимаете "Enter" для перехода к новой строке, вы просто добавляете этот символ.

Помните, когда мы проходили двойные и одинарные кавычки я говорил Вам, что в двойных кавычках переменные интерполируются, а в одинарных - нет?! Так вот, это не совсем так. Интерполируются не переменные, а метасимволы. Теперь Вы должны это запомнить.

Давайте рассмотрим такую ситуацию, когда нам необходимо вывести на экран последовательность символов "\n", а не метасимвол. В таком случае выводимую строку можно заключить в одинарные кавычки и интерполяции не произойдет. А если ситуация не позволяет этого делать? Допустим, в этой же строке нам нужно вывести и значение некоторой переменной? Безусловно, мы можем заключить переменную в двойные кавычки, а последовательность "\n" в одинарные и выводить всё поотдельности. Но делать этого не следует, т.к. в Perl предусмотрен еще один метасимвол, говорящий интерпретатору, что следующий символ не подлежит интерполяции. Другими словами этот символ отменяет действие следующего за ним метасимвола. Таким метасимволом является "\" (обратный слеш). Обратите внимание на следующий пример:
print "...и он спросил: "А где ж твоя голова?"..."; - выполнение такой строки приведет к неминуемой ошибке. С точки зрения Perl, строка для вывода началась с открытия первой двойной кавычки и закончилась второй, а не последней. Для Perl кавычки в данном случае - флаги, он рассматривает их не как обычные символы, предназначенные для вывода, а как метасимволы. С помощью символа "\" можно снизить пристрастность Perl к наблюдению за кавычками. Посмотрите как легко можно превратить кавычки в обычные символы:
print "...и он спросил: \"А где ж твоя голова?\"...";. С точки зрения Perl, эта строка безупречна и не содержит ошибок.
Также обстоят дела и с последовательностью "\n". Достаточно поставить перед ней обратные слеш, и она будет восприниматься как группа обычных символов: "\\n".

Обратным слешом удобно пользоваться когда речь идет о выведении HTML кода с подстановкой переменных, к примеру тега <FONT>: print "<font size=\"$size\" color=\"black\" face=\"Times new roman\">"; . В зависимости от значения переменной $size выводимая строка может быть любой. К примеру, если её значение - 4, строка получится следующей:

<font size="4" color="black" face="Times new roman"&gt

Использование \n при выводе страниц

Вспомните урок 5, где мы изучали оператор повторения FOR. Запустите программу, отображающую таблицу Пифагора и посмотрите в браузере исходный текст HTML. Вы увидите, что весь HTML файл написан в одну строку. Согласитесь, что это очень неудобно с точки зрения анализа выводимых данных.
Давайте модернизируем программу таким образом, чтобы она выводила HTML текст в несколько строк. Для этого достаточно поместить метасимвол "\n" после перевода строки тегом <BR>:

#!/usr/bin/perl #programm 8 print "Content-Type: text/html\n\n"; print '<font face="courier new">'; for($i=1;$i<=9;$i++){ for($u=1;$u<=9;$u++){ if(($u*$i)/10 < 1){print"&nbsp;"} unless($u*$i==1){print $u*$i}else{print"&nbsp;"} print "&nbsp;"; } print"<br>\n"; } print '</font>';

Вот теперь полный порядок!

* * * *

Напишите программу, которая выводит несколько произвольных E-mail адресов по одному на каждой строке. Используйте тег <pre> и символ возврата каретки для форматирования.

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



Встроенные переменные получение данных методом GET



Урок 10. Встроенные переменные, получение данных методом GET

Когда сервер выполняет скрипт, для него создаются некоторые переменные окружения, среди которых как локальные данные (адрес скрипта на сервере, версия П/О сервера), так и данные полученные с HTTP запросом (версия браузера, IP удаленной машины и т.д.) . Знать эти данные для CGI программиста просто жизненно важно. Вот эти переменные:

$ENV{'REQUEST_METHOD'} Это одно из самых главных поле используемое для определения метода запроса HTTP. Протокол HTTP использует методы GET и POST для запроса к серверу. Они отличаются тем что при методе GET запрос является как бы частью URL т.е. http://..../cgi-bin/myscript.cgi?param=value а при методе POST данные передаются в теле HTTP-запроса (при GET тело запроса пусто).
Для нас пока интересен только метод GET.
$ENV{'QUERY_STRING'} Это строка запроса при методе GET.
$ENV{'CONTENT_TYPE'} Тип тела запроса.
$ENV{'REMOTE_ADDR'} IP-Адрес удаленного Хоста, делающего данный запрос.
$ENV{'REMOTE_HOST'} Если запрашивающий Хост имеет доменное имя, то эта переменная содержит его, в противном случае -тот же самый IP-адресс что и REMOTE_ADDR.
$ENV{'SCRIPT_NAME'} Содержит URL адрес файла скрипта.
$ENV{'SCRIPT_FILENAME'} Полный путь к скрипту на сервере.
$ENV{'SERVER_NAME'} Имя серера ,чаще всего доменное как www.microsoft.com ,но в редких случаях за неимением такового может быть IP-адресом.
$ENV{'SERVER_PORT'} TCP-Порт сервера использующийся для соединения .По умолчанию HTTP-порт 80, хотя может быть в некоторых случаях другим.
$ENV{'SERVER_SOFTWARE'} Программное обеспечение сервера.
$ENV{'AUTH_TYPE'}
$ENV{'REMOTE_USER'}
Эти переменные определены в том случае, когда запрошенный ресурс требует аутентификации пользователя.
$ENV{'HTTP_ACCEPT'} Давая запрос на сервер браузер обычно рассчитывает получить информацию определенного формата, и для этого он в заголовке запроса указывает поле Accept:, Отсюда скрипту поступает список тех MIME, которые браузер готов принять в качестве ответа от сервера.
$ENV{'HTTP_USER_AGENT'} Браузер обычно посылает на сервер и информацию о себе, чтоб базируясь на знании особенностей и недостатков конкретных браузеров CGI-скрипт мог выдать информацию с учетом этого. Например, разные браузеры могут поддерживать или не поддерживать какие-то HTML тэги.
$ENV{'CONTENT_LENGTH'} Длина в байтах тела запроса.
$ENV{'GATEWAY_INTERFACE'} Версия протокола CGI.
$ENV{'SERVER_PROTOCOL'} Версия HTTP протокола сервера.





Урок 11. HTML формы, функция ParseForm, метод POST

Начнем с того, о чем я уже говорил, а именно о том, что методом GET можно передавать несколько параметров, а не только один. Если знак "?" отделяет параметры от URL скрипта, то параметры отделяются друг от друга знаком "&" (коммерческое AND). Чтобы получить эти параметры "на руки" внутри скрипта в виде обычных переменных, придумана функция ParseForm (англ. Разделять Форму). Пусть её вид Вас не пугает, скоро Вы научитесь писать функции подлеще...

&parse_form; sub parse_form { if ($ENV{'REQUEST_METHOD'} eq "POST") {$mode = 0} if ($ENV{'REQUEST_METHOD'} eq "GET") {$mode = 1} if ($mode == 0) {read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'})} if ($mode == 1) {$buffer = $ENV{'QUERY_STRING'}} @pairs = split(/&/, $buffer); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $FORM{$name} = $value; } }

Я не буду пока вдаваться в подробности работы этой функции, скажу лишь чем она для нас интересна. Не зависимо от метода передачи данных, GET или POST (поговорим об этом ниже), эта функция выдает данные в виде переменных вида $FORM{'значение'}. В связи с этим изменились и условия записи данных в строке URL. Теперь их следует писать в таком виде:
"http://.../script.pl?параметр1=значение1&параметр2=значение2".
Для экономии места, во всех следующих программах я не буду полностью писать функцию, а буду лишь ссылаться на неё. Вы же должны писать всё полностью.

Следующая программа демонстрирует работу функции ParseForm.

#!/usr/bin/perl #programm 10 print "Content-Type: text/html\n\n"; &parse_form; print "A + B = ",$FORM{'a'}+$FORM{'b'},"<br>"; print "A - B = ",$FORM{'a'}-$FORM{'b'},"<br>"; print "A * B = ",$FORM{'a'}*$FORM{'b'},"<br>"; print "A<sup>B</sup> = ",$FORM{'a'}**$FORM{'b'};

Эта программа выводит сумму, разность, произведение и результат возведения одного числа в другое. Вызывать программу следует таким образом:
"http://.../script.pl?a=значение1&b=значение2", к примеру
"http://.../script.pl?a=256&b=2"
Про такую запись говорят: "У программы 2 параметра вызова - a и b. a=256, b=2".

Формы

Чтобы было удобнее передавать данные скрипту, в HTML введены формы. С формами Вы уже сталкивались, когда заполняли строку поиска в поисковой системе, или при общении в ЧАТе.
И так, что же представляет из себя форма? Форма - это совокупность специальных HTML тэгов, ограниченных тегами <FORM> и </FORM>.
Форма может содержать в себе помимо полей формы другие HTML теги (к примеру <table>).
Чтобы можно было передать скрипту данные, введенные в форме, необходимо наличие кнопки "submit".
При нажатии на эту кнопку отсылаются данные только той формы, в которой эта кнопка находится.
Передать данные из разных форм средствами HTML нельзя.
Форма может содержать неограниченное кол-во элементов или не содержать их вовсе.

Параметры формы

Тэг <FORM> имеет нескопараметроветорв:

action адрес скрипта, которому следует передать данные.
method метод, которым передается форма (GET или POST)
target Это поле позволяет указать окно/фрейм из которого будет делаться запрос. По умолчанию запрашивает текущее окно/фрейм

Таким образом форму можно записать так:
<form method="get" action="/cgi-bin/script.pl"></form>



Оператор Print хеши



Урок 12. Оператор Print, хеши.

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

Способы определения хеша

Способ 1:

%hash = ( 'шляпа' => 'серая', 'водка' => 'горькая', 'вобла' => 'вкусная' );

Способ 2:

%hash = (); $hash{'шляпа'} = 'серая'; $hash{'водка'} = 'горькая'; $hash{'вобла'} = 'вкусная';

С одним из системных хешей Вы уже знакомы, это хеш %ENV. Приведенная ниже программа демонстрирует все значения этого хеша.

#!/usr/bin/perl #programm 12 print "Content-Type: text/html\n\n"; $flag=1; @array=%ENV; print "<table>\n"; foreach $i(@array){ if($flag==1){$flag=0; print "<tr><td>$i</td>"; }else{$flag=1; print "<td>$i</td></tr>\n" }} print "</table>";

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



Функции работы с файлами



Урок 13. Функции работы с файлами

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

Дескриптор файла

Дескриптор файла в Perl-программе — это имя соединения для ввода-вывода между вашим Perl-процессом и внешним миром. Имена дескрипторов файлов похожи на имена помеченных блоков, но они берутся из другого пространства имен (поэтому у вас может быть скаляр $fred, массив $fred, хеш %fred, метка fred, а теперь и дескриптор файла fred). Как и метки блоков, дескрипторы файлов используются без специального префиксного символа, поэтому их можно спутать с существующими или возможными в будущем зарезервированными словами (для команд, подпрограмм и др.). Рекомендую составлять дескрипторы файлов только из прописных букв. Во-первых, они будут хорошо выделяться в тексте программы, и, во-вторых, благодаря этому программа не даст сбой при введении нового зарезервированного слова.



Функции для работы с файлами (продолжение)



Урок 14. Функции для работы с файлами (продолжение)

Оператор "-X"

Проверка файла, где 'X' - одно из ниже описанных значений. Это унарный оператор с одним аргументом - либо именем файла, либо указателем файла. Проверяет одно из условий. Если аргумент не указан, то берется значение переменной $_. Несмотря на странный вид, это унарный оператор с соответствующим приоритетом. Аргумент можно заключать в круглые скобки. 'X' имеет следующие значения:

-r Файл разрешен на чтение эффективным uid/gid
-w на запись -//-
-x исполнение -//-
-o принадлежит эффективному uid (идентификатор пользователя)
-R Файл разрешен на чтение реальным uid/gid
-W на запись -//-
-X исполнение -//-
-O принадлежит реальному uid
-e файл существует
-z пустой
-s не пустой
-f обычный текст
-d директория
-l символическая ссылка
-p pipes (конвейер)
-S socket (гнездо)
-b специальное блочное устройство
-c -//- символьное -//-
-t указатель на уст-во tty
-u установлен бит setuid
-g -//- setgid
-k -//- sticky
-T текстовой файл
-B двоичный
-M "возраст" файла в днях на момент старта скрипта
-A дней с последнего чтения
-C дней с последней модификации inode

Если проверяется условие, то возвращает True при истинном утверждении и False при ложном. Код ниже проверяет наличие файла "file.txt" в текущей директории и при его наличие выводит кол-во дней с момента последнего обращения к нему:

if (-e("file.txt")){print (-A("file.txt"))} else {print "Файл не создан"}



Функции для работы с файлами (продолжение)



Урок 15. Функции для работы с файлами (продолжение)

Подпрограммы прототипы



Урок 17. Подпрограммы, прототипы

Для применения подпрограммы ее необходимо определить либо в текущем модуле (файле), либо во внешнем модуле (файле). Подпрограммы определяются и декларируются следующим образом:

sub имя; - Только декларация. Определение ниже. sub имя (прототипы); - То же но с декларацией параметров. sub имя блок; - Декларация и определение. sub имя (прототипы) блок; - То же, но с параметрами.

Все параметры передаются подпрограмме как массив @_. Соответственно $_[0] - первый параметр, $_[1] - второй и т.д. Массив @_ - локальный, но он содержит адреса параметров, поэтому можно изменять значение параметров. Возвращаемое значение подпрограммы - результат последнего оператора. Это может быть как скаляр так и массив. Можно принудительно возвращать результат используя функцию return().

Подпрограмму можно вызвать, используя префикс '&' перед именем подпрограммы. Если подпрограмма предварительно продекларирована, то префикс и скобки можно опустить.

Для применения переменных доступных только внутри блока или подпрограммы необходимо определить их с помощью функции my(список). Если переменная одна, то скобки можно опустить.

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

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

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



Работа с числами



Урок 18. Работа с числами

Функции для работы со строками



Урок 19. Функции для работы со строками

Операторы для работы со строками (продолжение)



Урок 20. Операторы для работы со строками (продолжение)

Регулярные выражения



Урок 21. Регулярные выражения

Наш сегодняшний урок ЧЕРЕЗВЫЧАЙНО труден - будем изучать весьма специфическую и тяжелую для усвоения информацию. Но понять эту тему важно, ведь она - вся сила (Power) языка Perl.

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

Совет: Прочитайте этот урок не спеша, пытаясь вдуматься буквально в каждое слово. С первого раза Вы, скорее всего, не поймете тему. По этому читайте её не менее 4-х раз с интервалом не менее 1 часа. Это поможет запомнить до 60% всей информации на уровне восприятия и до 30% на интуитивном уровне. Лучше всего держать всю эту страницу где-нибудь "под рукой" в распечатанном виде, чтобы в случае необходимости Вы смогли быстро найти нужную Вам информацию.
Не зацикливайтесь на том, что Вам не понятны примеры. Это естественно. Просто примите к сведению, что эти скрипты работают и не старайтесь разобраться в них. Сегодня Вы должны ознакомиться с темой только теоретически, практикой займемся немного позже.

Чаще всего в Perl регулярные выражения используются в операторах поиска и замены таких как s//, m/, операторах связки =~ или != и т.д. Как правило все эти операторы имеют схожие опции такие как:

i - не различать строчные и заглавные буквы.
m - считать строку многострочной.
s - однострочная строка.
x - расширенный синтаксис ( использование пробелов и комментариев)

Обычно все эти опции обозначают как '/x'. Их можно использовать даже внутри шаблонов, используя новую конструкцию (?...)

Регулярные выражения или шаблоны (pattern) то же самое, что и regexp процедуры в Unix. Выражения и синтаксис заимствованы из свободно распространяемых процедур V8 Генри Спенсера (Henry Spencer), там же они подробно и описаны.

В шаблонах используются следующие метасимволы (символы обозначающие группы других символов) часто называемые egrep - стандартом:

\ - считать следующий метасимвол как обычный символ.
^ - начало строки
. - один произвольный символ. Кроме '\n' - конец строки.
$ - конец строки
| - альтернатива (или)
() - группировка
[] - класс символов

Метасимволы имеют модификаторы (пишутся после метасимвола):

* - повторяется 0 или большее число раз
+ - -//- 1 или большее число раз
? - 1 или 0 раз
{n} - точно n раз
{n,} - по меньшей мере раз
{n,m} - не меньше n, но и не больше m

Во все других случаях фигурные скобки считаются обычными (регулярными) символами. Таким образом '*' эквивалентна {0,} , '+' - {1,} и '?' - {0,1}. n и m не могут быть больше 65536.

По умолчанию действие метасимволов "жадно" (greedy). Совпадение распространяется столько раз, сколько возможно, не учитывая результат действия следующих метасимволов. Если вы хотите "уменьшить их аппетит", то используйте символ '?'. Это не изменяет значение метасимволов, просто уменьшает распространение. Таким образом:

*? - станет 0 и более
+? - 1 и более
?? - 0 или 1 раз
{n}? - точно n раз
{n,}? - не меньше n раз
{n,m}? - больше или равно n и меньше m раз

Шаблоны работают так же, как и двойные кавычки, поэтому в них можно использовать `\` - символы (бэкслэш-символы):

\t - символ табуляции
\n - новая строка
\r - перевод каретки
- перевод формата
\v - вертикальная табуляция
\a - звонок
\e - escape
\033 - восьмеричная запись символа
\x1A - шестнадцатеричная
\c[ - control символ
\l - нижний регистр следующего символа
\u - верхний регистр -//-
\L - все символы в нижнем регистре до \E
\U - в верхнем -//-
\E - ограничитель смены регистра
\Q - отмена действия как метасимвола

Дополнительно в Perl добавлены следующие метасимволы:

\w - алфавитно-цифровой или '_' символ
\W - не -//-
\s - один пробел
\S - один не пробел
\d - одна цифра
\D - одна не цифра

Обратите внимание, что все это "один" символ. Для обозначения последовательности применяйте модификаторы. Так:

\w+ - слово
\d+ - целое число
[+-]?\d+ - целое со знаком
[+-]?\d+\.?\d* - число с точкой

Кроме того существуют мнимые метасимволы. Обозначающие не существующие символы в месте смены значения. Такие как:

\b - граница слова
\B - не граница слова
\A - начало строки
\Z - конец строки
\G - конец действия m//g

Граница слова (\b) - это мнимая точка между символами \w и \W. Внутри класса символов '\b' обозначает символ backspace (стирания). Метасимволы \A и \Z - аналогичны '^' и '$', но если начало строки '^' и конец строки '$' действуют для каждой строки в многострочной строке, то \A и \Z обозначают начало и конец всей многострочной строки.

Если внутри шаблона применяется группировка (круглые скобки), то номер подстроки группы обозначается как '\цифра'. Заметьте, что за шаблоном в пределах выражения или блока эти группы обозначаются как '$цифра'. Кроме этого существуют дополнительные переменные:

$+ - обозначает последнее совпадение
$& - все совпадение
$` - все до совпадения
$' - все после совпадения

Пример:

$s = "Один 1 два 2 и три 3"; if ($s =~ /(\d+)\D+(\d+)/) { print "$1\n";# Результат '1' print "$2\n";# '2' print "$+\n";# '2' print "$&\n";# '1 два 2' print "$`\n";# 'Один ' print "$'\n";# ' и три 3' }

Perl версии 5 содержит дополнительные конструкции шаблонов:

(?#комментарий) - комментарий в теле шаблона.
(?:шаблон) - группировка как и '( )', но без обратной ссылки
(?=шаблон) - "заглядывание" вперед. Например /\w+(?=\t)/ соответствует слову, за которым идет табуляция, но символ '\t' не включается в результат.

Пример:

$s = "1+2-3*4"; if ($s =~ /(\d)(?=-)/) # Найти цифру за которой стоит '-' { print "$1\n"; # Результат '2' } else { print "ошибка поиска\n";} (?!шаблон) - "заглядывание" вперед по отрицанию.

Пример:

$s = "1+2-3*4"; if ($s =~ /(\d)(?!\+)/) # Найти цифру за которой не стоит '+' { print "$1\n"; # Результат '2' } else { print "ошибка поиска\n";}

Правила регулярных выражений:

Любой символ обозначает себя самого, если это не метасимвол. Если вам нужно отменить действие метасимвола, то поставьте перед ним '\'. Строка символов обозначает строку этих символов. Множество возможных символов (класс) заключается в квадратные скобки '[]', это значит, что в данном месте может стоять один из указанных в скобках символов. Если первый символ в скобках это '^' - значит ни один из указанных символов не может стоять в данном месте выражения. Внутри класса можно употреблять символ '-', обозначающий диапазон символов. Например, a-z - один из малых букв латинского алфавита, 0-9 - цифра и т.д. Все символы, включая специальные, можно обозначать с помощью '\' как в языке С. Альтернативные последовательности разделяются символом '|' Заметьте что внутри квадратных скобок это обычный символ. Внутри регулярного выражения можно указывать "подшаблоны" заключая их в круглые скобки и ссылаться на них как '\номер' Первая скобка обозначается как '\1'.

* * * *



Операторы поиска и замены



Урок 22. Операторы поиска и замены

Еще немного о циклах



Урок 23. Еще немного о циклах

Функции для работы с массивами



Урок 24. Функции для работы с массивами

Функции для работы с хешами



Урок 25. Функции для работы с хешами

Дата и время



Урок 26. Дата и время

Скорее всего эти функции Вам будут недоступны, если вы используете Windows95/98.



Функции для работы с директориями



Урок 27. Функции для работы с директориями

заключительный Прочие функции



Урок 28 заключительный. Прочие функции

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



я хотел бы сказать, что



Заключение

И в заключении я хотел бы сказать, что приведенного здесь материала (включая статьи и ссылки) более чем достаточно для полного изучения CGI программирования на Perl.
Рекомендую начать изучение готовых Perl-скриптов с целью познания приемов, используемых в CGI программировании. Если Вы сможете изучить 30-40 скриптов различной направленности (E-mail рассылки и формы для голосования, мини-форумы и счетчики посещений, гостевые книги и ленты новостей, и т.д.), понять их принцип действия, и написать скрипты, повторяющие их работу, то можете с уверенностью сказать себе: "Да, теперь я действительно понял как они летают!".
И помните, Вы всегда можете обратиться со своими вопросами к автору сайта по E-mail.


Запись в тело файла



Запись в тело файла

Нетрудно догадаться, что работать с файлом (считывать и записывать информацию) можно только тогда, когда он открыт.
Выводятся данные в файл всё тем же оператором Print. Оператору необходимо указать, в какой именно файл (может быть несколько одновременно открытых файлов) следует выводить информацию, затем помещают выражение, предназначенное для вывода:

open (file,">>file.txt"); print file "Здесь был Вася"; close file;

Если не указать файловую переменную, строка "Здесь был Вася" выведется на экран браузера.