Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Программирование скриптов на Perl'e (выпуск № 3)


Служба Рассылок Subscribe.Ru проекта Citycat.Ru

Программирование скриптов на Perl'e (выпуск 3).


Здравствуйте дорогие мои подписчики.

Мне очень приятно, что за несколько дней, прошедших с перевода моей рассылки в другую категорию, количество подписчиков на нее возросло с 9 человек до нескольких тысяч.   Это показывает, насколько велик интерес к теме программирования на Perl'e.   Уже начали приходить письма с вопросами и пожеланиями.   Хочу привести (с разрешения автора) отрывок из одного письма, пришедшего мне в первый же день:

Здравствуйте Виталий!
...
Являюсь подписчиком рассылки по Перлу, как старой умершей, так и вашей.   С удовольствием прочитал первые два выпуска вашей рассылки.   Информация в них дана интересно, грамотно и компактно.   Вобщем, хочу пожелать Вам и себе, чтобы стиль выпусков не менялся.
...
С уважением, Алекcей Дашевский.

alex@kpgaz.chernigov.ua

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

Я очень надеюсь, что у меня получится делать эту рассылку так, чтобы она могла приносить пользу всем ее подписчикам как новичкам в Perl'e, так и опытным программистам.

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

Ну и напоследок, перед тем как начать, еще несколько слов.   Если Вы до сих пор пишите свои Perl скрипты в "Блокноте" или "ДОС Навигаторе" ("Фар Менеджере" и т. д.), "Миднайт Командере" или "ХЕмаке", то бросайте это гиблое дело.   Есть одна компания, которая позаботилась о том, чтобы написание Perl скриптов стало более удобным.   Это компания SolutionSoft - http://www.solutionsoft.com.   Она выпустила поистине уникальную программу - Perl Builder, причем на ее сайте доступна как версия этой программы для Windows, так и версия для Unix-систем.   На данный момент вышла версия Perl Builder 2.0.   Есть правда одна проблема - это 14-дневные версии программы, а для регистрации надо платить 279 долларов, но сеть есть сеть и в ней можно найти крэк для всего...

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



Встроенные переменные Perl.

Как Вы уже поняли (или давно знали) Perl - это очень интересный и не похожий на другие язык.   И естественно, что в нем должно существовать такое, чего нет в большинстве других языков.   Так вот такой своеобразной "фишкой" Perl'а является наличие встроенных переменных.

Что же это такое?   Это переменные, которые имеют в Perl'е специальные значения.   Они обозначаются обычно последовательностью из двух символов, причем первый это символ '$', с которого начинаются имена всех скалярных переменных и произвольный, часто не буквенно-цифровой символ.   Есть возможность записывать имена таких переменных их буквенными синонимами, для этого нужно указать в начале программы: use English;.   Но я не буду приводить полные имена встроенных переменных, т. к. считаю, что в этом нет необходимости.

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

Переменные Описание
$_ Переменная - по умолчанию для операторов ввода и поиска.   То есть если в качестве аргумента не указана никакая переменная, то используется именно эта.
$цифра Содержит найденные подстроку в последнем поиске, когда шаблон содержит метасимволы в круглых скобках.   Цифра в данном случае это номер скобок.   Первая подстрока имеет номер 1.
$& Найденная подстрока в последнем поиске по шаблону.
$ Подстрока предшествующая найденной подстроке.
$' Подстрока последующая за найденной подстрокой.
$+ Подстрока найденная в поиске с выбором по "или".
$* Если значение этой переменной установить равным 1 то переменная, в которой осуществляется поиск, будет считаться многострочной, т.е. содержащей символы '\n' - перевод строки.   Если значение равно 0, то переменная считается однострочной.   (В Perl'е версии 5 и выше не рекомендуется использовать эту переменную.)
$. Номер прочитанной строки последнего оператора ввода.   Закрытие файла вызывает очистку значения этой переменной.
$/ Символ - признак конца входной строки.   По умолчанию это '\n'.
$| Если присвоить этой переменной не нулевое значение, то будет сброс буфера вывода после каждой операции вывода.   Значение по умолчанию - 0.
$, Символ, добавляемый оператором print после каждого элемента из списка параметров.
$\ Символ, добавляемый оператором print после вывода всех параметров.
$; Символ-разделитель для эмуляции многомерных массивов в хэшах.   По умолчанию '\034'.
$# Формат по умолчанию для вывода чисел.
$% Формат по умолчанию для вывода номеров страниц.
$= Длина одной страницы.   По умолчанию 60 строк.
$- Количество оставшихся строк на странице.
$~ Имя формата текущего вывода.   По умолчанию имя указателя.
$^ Имя текущего формата для заголовка страницы.
$: Символы переноса строки для многострочных полей.   В строке формата такие поля начинаются символом '^'.   По умолчанию ' \n-'.
$^L Символ перевода формата (смены листа).   По умолчанию '\f'.
$^A Текущее значение аккумулятора функции write() для format() .   Значение этой переменной можно увидеть только при использовании функции formline() т.к. write() очищает ее после каждого вывода.
$? Данная переменная содержит статус завершения таких процессов как: закрытие pipe, завершение функций system(), wait() и ....
$! В числовом контексте возвращает код ошибки errno.   В строковом - строку сообщения об ошибке.   Можно принудительно присвоить этой переменной код ошибки, чтобы получить системное сообщение для данного кода или установить код завершения для функции die().
$@ Сообщение об ошибке последней команды eval().
$$ Номер текущего процесса.
$< Реальный UID текущего процесса.
$> Эффективный UID текущего процесса.
$( Реальный GID текущего процесса.
$) Эффективный GID текущего процесса.
$O Имя файла программы.   Если этой переменной присвоить какое-нибудь значение то его можно видеть в команде ps, что удобно для контроля за состоянием программы.
$[ Номер первого элемента массива или символа строки.   Значение по умолчанию - 0.
$] Строка сообщение версии Perl'а.   Печатается по команде perl -v.   Применяется в программе для определения рабочей версии Perl'а.   В числовом контексте это номер версии плюс номер модификации / 1000.
$^D Текущее значение ключа отладки '-D'.
$^F Номер максимального системного описателя файлов (system file descriptor).   Обычно - 2.
$^I Текущее значение inplace-edit возможности.   Для отключения используйте undef.
$^P Внутренний флаг отладки.   Применяется для того, чтобы отладчик не отслеживал самого себя.
$^T Время в секундах с начала 1970 года старта текущей программы.
$^W Значение флага '-w': true -если включено и false - выключено.
$^X Команда запуска Perl.   Аналогично argv[0] в С.
$ARGV Имя текущего файла читаемого оператором '<>'.
@ARGV Массив параметров строки запуска программы.
@INC Список директорий диска, которые просматривает Perl для выполнения команд do, require или use.
%INC Этот хэш содержит имена директорий для имен использованных файлов командами do или require.   Ключ - имя файла, а значение - директория.
%ENV Этот хэш содержит значения переменных окружения.   Изменение этих значений вызывает изменение окружения для процессов потомков.
%SIG Этот хэш содержит имена подпрограмм для системных сигналов, таких как INT, QUIT, PIPE, ...   Значение 'DEFAULT' - для системной обработки.   'IGNORE' - игнорировать данный сигнал.

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

Начнем с самого начала.

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

Следующая встроенная переменная, о которой мы поговорим - это $цифра (цифра как Вы понимаете любая, но отличная от нуля).   Этих переменных в Perl'е не одна - $1, $2, ... и т. д.   В эту встроенную переменную (будем говорить пока только об одной - $1) записывается выражение, найденное в последнем поиске, шаблон для которого был заключен в круглые скобки.   Эти переменные очень удобны, если Вам нужно найти несколько определенных последовательностей следующих друг за другом на неопределенном расстоянии.   Тогда Вы задаете в общем шаблоне нужные Вам подшаблоны для искомых последовательностей, взятые в круглые скобки, и в результате, после поиска, получаете во внутренних переменных $1, $2, … и т. д. искомые подстроки, символы и пр.

Переменная $& - это встроенная переменная, в которую, после проведения поиска по шаблону, запишется значение, соответствующее ВСЕМУ шаблону поиска, если конечно таковое будет существовать в проверяемой строке.   Таким образом, по значению этой переменной можно судить о том, содержала ли проверяемая строка искомую последовательность.

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

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

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

Во внутренне переменной $! содержится либо код последней ошибки (в числовом контексте), либо непосредственно сообщение о последней произошедшей ошибке (в строковом контексте).   Эта переменная может быть полезна при создании своих обработчиков ошибок.

Ну и, наконец, рассмотрим еще одну встроенную переменную Perl'а - хэш %ENV.   Как описывалось ранее, он содержит значения переменных окружения, а именно некоторые из этих переменных и используются при анализе запросов из HTML-формы клиента к CGI-скрипту.   Как Вы знаете, каждый элемент хэша представляет собой пару "ключ"-"значение".   Ниже приводятся имена "ключей", используемые при HTTP-запросах.

Переменные окружения Описание
SERVER_SOFTWARE Название и версия информационного сервера, который отвечает на запрос (и запускает шлюз). Формат: имя/версия.
SERVER_NAME Имя хоста, на котором запущен сервер, DNS имя, или IP адрес в том виде, в котором он представлен в URL.
SERVER_ADMIN E-mail администратора сервера.
GATEWAY_INTERFACE Версия CGI спецификации на тот момент, когда компилировался сервер. Формат: CGI/версия.
DOCUMENT_ROOT Корневая директория страниц.
SERVER_PROTOCOL Имя и версия информационного протокола, в котором пришел запрос. Формат: протокол/версия.
SERVER_PORT Номер порта, на который был послан запрос.
REQUEST_METHOD Метод, который был использован для запроса. Для HTTP, это "GET", "HEAD", "POST", и т.д.
REQUEST_URI Строка запроса из URL.
PATH Системная переменная PATH.
SCRIPT_FILENAME Полный путь к файлу скрипа на сервере.
SCRIPT_NAME Виртуальный путь к шлюзу, который должен выполняться, используемый для получения URL.
QUERY_STRING Информация, следующая за "?" в URL, к которому относится данный шлюз.   Эта информация представляет собой строку запроса.   Она не должна быть декодирована никоим образом.   Вне зависимости от командной строки эта переменная всегда должна быть установлена при наличии такой информации.
REMOTE_HOST Имя хоста, производящего запрос.   Если сервер не имеет такой информации, он должен установить REMOTE_ADDR, а это поле оставить не установленным.
REMOTE_ADDR IP адрес хоста, производящего запрос.
REMOTE_PORT Номер IP порта клиента.
SERVER_PORT Номер IP порта сервера.
CONTENT_TYPE Для запросов, которые содержат дополнительную добавочную информацию, такие как HTTP POST и PUT, здесь содержится тип данных этой информации.
CONTENT_LENGTH Длина данных, которые передает клиент.
HTTP_HOST Имя сервера, на котором отрабатывается скрипт.
HTTP_CONNECTION Режим IP соединения.
HTTP_ACCEPT Список MIME типов, которые клиент может обработать, как задано в HTTP заголовках.   Другие протоколы должны получить эту информацию из других мест (если она им необходима).   Каждый тип в этом списке должен быть отделен запятой согласно HTTP спецификации.   Формат: тип/подтип, тип/подтип.
HTTP_USER_AGENT Просмотрщик, который использует клиент для посылки запроса, проще говоря, браузер клиента.   Общий формат: программа/версия библиотека/версия.
HTTP_ACCEPT_ENCODING Допустимые клиентом кодировки данных.
HTTP_ACCEPT_LANGUAGE Допустимые языки клиента.

Вот пример значений этих переменных, при запуске программы, распечатывающей значения хэша %ENV, на моем компьютере.

SERVER_SOFTWARE = Apache/1.3.3 (Unix) (Red Hat/Linux)
GATEWAY_INTERFACE = CGI/1.1
DOCUMENT_ROOT = /home/httpd/html
REMOTE_ADDR = 192.168.0.1
SERVER_PROTOCOL = HTTP/1.0
REQUEST_METHOD = GET
QUERY_STRING = pr1=1+pr2=2
HTTP_USER_AGENT = Mozilla/4.5 [en] (X11; I; Linux 2.2.2-ac7 i686)
PATH = /sbin:/usr/sbin:/bin:/usr/bin
HTTP_ACCEPT = image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, image/png, */*
HTTP_CONNECTION = Keep-Alive
REMOTE_PORT = 1029
HTTP_ACCEPT_LANGUAGE = en
SCRIPT_NAME = /cgi-bin/test.cgi
HTTP_ACCEPT_ENCODING = gzip
SCRIPT_FILENAME = /home/httpd/cgi-bin/test.cgi
SERVER_NAME = Vit.MyHome
REQUEST_URI = /cgi-bin/test.cgi?pr1=1+pr2=2
HTTP_ACCEPT_CHARSET = iso-8859-1,*,utf-8
SERVER_PORT = 80
HTTP_HOST = vit
SERVER_ADMIN = root@localhost


На этом на сегодня все с программированием.

Но это еще не совсем конец.   Я решил, начиная с этого выпуска рассылки, ввести раздел "Лучшая ссылка", в котором будут даваться ссылки на ресурсы сети, относящиеся к теме данной рассылки.   И в этом выпуске, несомненно, лучшей ссылкой является ссылка на сайт комании SolutionSoft - http://www.solutionsoft.com.

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


Виталий Ярошевский vitalij@newmail.ru


При подготовке данной рассылки были использованы следующие материалы:

1. "Основы программирования на языке Перл"     Маслов В. В. - "Радио и связь" 1999
2. "Спецификация языка Perl"     Алена Федосеева
3. "CGI - Common Gateway Interface"     Кирилл Максимов


P. S.   Кстати.   Поздравляю всех читателей данной рассылки, ну и себя заодно, со славным праздником - моим днем рождения, который состоится 12 октября.   Очень надеюсь, что это событие не помешает мне вовремя выпустить очередной номер рассылки.



http://subscribe.ru/
E-mail: ask@subscribe.ru

В избранное