Показ дописів із міткою Perl. Показати всі дописи
Показ дописів із міткою Perl. Показати всі дописи

07 квітня 2020

Введение в Perl

    Что такое Perl? Это сокращенное название языка программирования Practical Extraction and Report Language (Практический язык извлечений и отчетов). Что подразумевается под "извлечениями" и "отчетами"? Почему практический язык? Для чего он предназначен? Какие задачи можно решать с его помощью? Эти и многие другие вопросы возникают, естественно, у любого человека, хоть немного знакомого с информатикой, когда он впервые сталкивается с новым для него языком программирования. Эта глава и задумывалась как ответ на поставленные выше вопросы, так как зная, что может, для чего предназначен язык программирования (а время универсальных языков, кажется, миновало), программист, в конечном счете, решает, а стоит ли тратить время на его изучение. Хотя здесь также встают вопросы о легкости и быстроте освоения нового языка, доступности компиляторов, существовании службы его поддержки, стоимости и т. д. Об этом также пойдет речь в этой главе, которая познакомит читателя с огромным миром Perl-программирования, и станет той отправной точкой, с которой он, мы надеемся, стремительно и без оглядки войдет в него и останется в нем навсегда.
     Язык Perl родился в недрах операционной системы Unix как реакция одного талантливого программиста на ограниченную возможность стандартных средств системного администрирования в этой операционной среде. Авторы прекрасно осознают, что большинство читателей знакомы с Unix, возможно, только по названиям книг, лежащих на полках магазинов, так как традиция изучения информационных технологий в нашей стране связана больше с операционными системами семейства Microsoft Windows [Под семейством операционных систем Microsoft Windows понимаются операционные системы Windows 95/98/NT.], чем с системой UNIX, которая является базой изучения информатики в западных университетах. Поэтому для воспитанных в традициях Windows читателей мы сделаем небольшое отступление и кратко охарактеризуем процедуру администрирования UNIX, которая радикально отличается от аналогичной работы в операционной системе Windows.
     Под администрированием понимается настройка операционной системы через установку значений ее параметров таким образом, чтобы она отвечала потребностям отдельного пользователя или группы пользователей. В системах семейства Windows подобная работа выполняется с помощью Реестра, представляющего собой базу данных двоичных данных, а для изменения параметров используется специальная программа regedit. В системе UNIX настройка осуществляется через специальные конфигурационные файлы, являющиеся обычными текстовыми файлами, и все изменения осуществляются выполнением команд, написанных на специальном языке оболочки (shell) и выполняемых, как правило, из командной строки. (Несколько лет назад на персональных компьютерах была широко распространена операционная система MS-DOS фирмы Microsoft, в которой для ввода команд также использовалась командная строка, поэтому читателю, работавшему в этой операционной системе, командная строка знакома.) В системе UNIX пользователь может создавать собственные команды на основе команд интерпретатора shell, сохранять их в обычных текстовых файлах и впоследствии выполнять также, как обычные стандартные команды операционной системы через командную строку. Следует отметить, что оболочка shell операционной системы UNIX является интерпретатором, в связи с чем команды пользователя имеют еще одно название — их называют сценариями или скриптами (script). Администратору операционной системы UNIX приходится писать большое количество скриптов, которые обрабатывают другие скрипты — текстовые файлы.
     Для этих целей обычно кроме командного языка оболочки shell используются специальные программы обработки текстовых файлов:
  • awk — программа сопоставления с образцами и генератор отчетов;
  • sed — пакетный редактор текстовых файлов.
     Обе эти программы являются фильтрами, которые последовательно считывают строки входных файлов и выполняют применимые к строке действия, определенные с помощью команд этих программ. Основными действиями являются выделение цепочек символов по заданным шаблонам, замена их по определенным правилам и генерирование новых файлов.

      Теперь можно перейти и к объекту нашего изучения — языку Perl, тем более что, как нам кажется, читателю уже должно быть понятно, почему он называется языком извлечений и отчетов. И начнем мы с истории его создания и разработки, которая, по существу, позволяет полнее понять его содержание.

      Perl был разработан Ларри Уоллом (Larry Wall) в 1986 году, когда он являлся системным администратором одного проекта UNIX, связанного с созданием многоуровневой безопасной сети, объединявшей несколько компьютеров, разнесенных на большие расстояния. Работа была выполнена, но потребовалось создание отчетов на основе большого числа файлов с многочисленными перекрестными ссылками между ними.
     Первоначально Ларри предполагал использовать для этих целей фильтр awk, но оказалось, что последний не мог управлять открытием и закрытием большого числа файлов на основе содержащейся в них же самих информации о расположении файлов. Его первой мыслью было написать специальную системную утилиту, решающую поставленную задачу, но вспомнив, что до этого ему уже пришлось написать несколько утилит для решения задач, не "берущихся" стандартными средствами UNIX, он принял кардинальное решение — разработать язык программирования, который сочетал бы в себе возможности обработки текстовых файлов (sed), генерации отчетов (awk), решения системных задач (shell) и низкоуровневое программирование, доступное на языке С. Результатом этого решения и явился язык Perl, интерпретатор для которого был написан на С.

      По утверждению самого Ларри Уолла при создании языка Perl им двигала лень — не в прямом смысле, а в смысле того, что для решения стоявшей перед ним задачи следовало бы написать большое количество программ на разных языках, входящих в состав инструментальных средств UNIX, а это достаточно утомительное занятие.
     Новый язык программирования сочетал в себе возможности системного администрирования и обработки файлов — две основные задачи, решаемые обычно при программировании в системе UNIX. Причем следует отметить, что язык Perl появился из практических соображений, а не из-за желания создать еще одно "красивое" средство для работы в UNIX, поэтому-то он и получил широкое распространение среди системных администраторов, когда Ларри Уолл предоставил его широкому кругу пользователей. С появлением языка Perl появилась возможность решать задачи с помощью одного инструмента, и не тратить время на изучение нескольких языков среды программирования UNIX.
     Первая версия языка не содержала многих возможностей, которые можно найти в последней версии Perl, с которой читатель познакомится в нашей книге и которая идентифицируется как версия 5.005_03 и считается устойчивой. Первоначально язык включал:
  • простой поиск по строковым образцам (шаблонам) в файлах;
  • дескрипторы файлов;
  • скалярные переменные;
  • форматы.
     Вся документация умещалась на 15 страницах, но Perl решал задачи быстрее, чем sed или awk, и быстро стал использоваться не только для решения задач системного администрирования.
     В дальнейшем сам Ларри Уолл позаимствовал у Генри Спенсера (Henry Spencer) пакет для работы с регулярными выражениями и модифицировал его для языка Perl. Другие функциональные возможности были разработаны не только Ларри Уоллом, но и его друзьями и коллегами, и включены в состав языка. Опубликование в Internet привело к появлению сообщества единомышленников, которые не только эксплуатировали, но и развивали язык. Он и по настоящее время продолжает интенсивно развиваться за счет разработки пакетов, реализующих новые применения языка к развивающимся информационным технологиям. В табл. 1.1 представлена динамика появления новых версий языка Perl, начиная с самой первой:
Таблица 1.1. Версии языка Perl и даты их выпуска

Версия Дата выпуска
perl 1 Январь, 1988
perl 2 Июнь, 1988
perl 3 Октябрь, 1989
perl 4 Март, 1991
perl 5 Октябрь, 1994
     В настоящее время, как уже отмечалось ранее, устойчивой версией считается версия Perl 5.005_03, но уже существует версия 5.005_67. Их все можно получить с основного узла Web, поддерживающего язык Perl, по адресу http://www.perl.com/ .
     В литературе по языку Perl принято, ссылаясь на сам язык, писать его с прописной буквой (Реrl), а строчными буквами (perl) обозначать интерпретатор языка. По образному высказыванию самого Ларри Уолла: "perl — это ничего более как всего лишь интерпретатор Perl".

Характерные черты Perl

    Perl — это интерпретируемый язык, оптимизированный для просмотра содержимого текстовых файлов, выделения из них информации и генерирования отчетов на основе этой информации, а также просто хороший язык для выполнения многих задач системного администрирования UNIX. Он обладает большим набором преимуществ как язык сценариев общего назначения, которые проявляются через его характерные черты и возможности.
     Первым в цепочке достоинств языка Perl мы назовем его интерпретируемость. Конечно, некоторые программисты, прочитав это, скажут: "Ну вот, нашли себе достоинство. Посмотрим, как быстро будет выполняться программа Perl длиной, скажем, в тысячу операторов?". Что ж, замечание существенное, если рассматривать Perl как язык создания больших информационных систем, и совершенно не выдерживающее критики, если вспомнить, для чего он предназначен — задач администрирования и обработки текстовых файлов — небольших по размерам сценариев, решающих нетрадиционные задачи, для программирования которых могло бы потребоваться взаимодействие нескольких специализированных языков. Разработка подобных решений с помощью компилируемых языков программирования потребовала бы на много больше времени, чем использование одного интерпретируемого: ведь цикл разработки программ на таком языке короче и проще, чем на компилируемом. Мы постепенно создаем программу, добавляя необходимые операторы, и сразу же получаем результаты, когда она завершена: интерпретатор perl постепенно компилирует все операторы во внутренний байт-код и программа готова к выполнению, как только в ней поставлена последняя точка (точнее точка с запятой, завершающая Последний оператор). Для небольших по объему программ — это достаточное преимущество, так как отладка занимает много времени. Да, интерпретируемая программа, естественно, будет выполняться медленнее программы, представленной в формате двоичного файла и выполняющейся без предварительной обработки интерпретатором, но если в этом возникнет необходимость, то можно решение на языке Perl использовать в качестве прототипа для компилируемого языка, например С. Суммируя все сказанное, можно заключить, что Perl позволяет легко и быстро получить требуемое решение задачи, сочетая в себе элементы компилируемых и интерпретируемых языков программирования.
Замечание
Интерпретатор perl, как, вероятно, заметил внимательный читатель, отличается от традиционных интерпретаторов тем, что программа транслируется в промежуточный байт-код, и только после этого выполняется. В традиционных интерпретаторах каждый вводимый оператор интерпретируется и сразу же выполняется, что может приводить к синтаксическим ошибкам во время выполнения. Peri-программа свободна от этого "недостатка", так как все синтаксические ошибки обнаруживаются во время трансляции в байт-код.

     Вторым преимуществом использования Perl для решения соответствующих задач (мы имеем в виду сетевые возможности) является его доступность для большинства серверных платформ:
  • практически все варианты UNIX;
  • MS-DOS;
  • Windows NT;
  • Windows 95/98;
  • OS/2;
  • Macintosh.
     Для всех перечисленных платформ разработаны и свободно распространяются интерпретаторы perl вместе с документацией по их установке и работе, что приятно отличает его от других программных средств. И здесь уместно сказать несколько слов об условиях использования и распространения самого Perl и разработанных на нем программ.
     Одним из способов распространения свободно распространяемого программного обеспечения, а именно таков интерпретатор perl, является использование Общей открытой лицензии GNU. По условиям этой лицензии файлы исходного текста программного продукта распространяются совершенно свободно и могут быть использованы любым лицом. Однако любые версии программы, созданные путем модификации этого кода, должны реализоваться также на условиях Общей открытой лицензии GNU, т. е. следует предоставлять файлы исходных текстов нового продукта любому, кто их захочет иметь. Этого зачастую вполне достаточно, чтобы защитить интересы автора первоначального программного продукта, однако может приводить к большому количеству производных версий исходного продукта, что приводит к "отчуждению" автора исходного продукта от процесса модификации его детища. Более того, в связи с большим количеством разнообразных версий, пользователям становится трудно определить, какая версия пакета является на текущий момент окончательной, будут ли написанные им сценарии, если речь идет о perl, правильно работать с имеющейся у него версией, и т. п.
     В связи с изложенными недостатками лицензии GNU, интерпретаторы языка Perl выпускаются на условиях лицензии Artistic License (Артистической лицензии), которая является некоторой вариацией лицензии GNU, и ее смысл заключается в том, что любой, кто выпускает пакет, полученный на основе Perl, должен ясно осознавать, что его пакет не является истинным пакетом Perl. Поэтому все изменения должны быть тщательно документированы и отмечены, выполнимые модули, в случае изменения, должны быть переименованы, а исходные модули должны распространяться вместе с модифицированной версией. Эффект от подобных условий заключается в том, что автор первоначального продукта всегда определяется как его владелец. При использовании Artistic License все условия Общей открытой лицензии GNU остаются в силе, т. е. она продолжает применяться.
     Третьим преимуществом языка Perl можно назвать его практическую направленность, т. е. он создавался из практических соображений решения задач администрирования и разработки приложений для UNIX, а это означает, что он обладает следующими важными свойствами:
  • полнотой;
  • простотой использования;
  • эффективностью.
     Под полнотой Perl понимается его способность решать все возникающие в системе UNIX, в связи с ее администрированием, задачи. И это действительно так! Ведь язык Perl, как отмечалось выше, вобрал в себя все наилучшие возможности стандартных средств администрирования UNIX, перечисленных в табл. 1.2.
Таблица 1.2. Стандартные средства администрирования UNIX
Язык Характеристика
awk Язык выделения по образцам информации из текстовых файлов
C Компилируемый язык общего назначения для решения задач низкого уровня
shell Основной командный язык запуска программ и скриптов, написанных на других языках программирования
sed Потоковый редактор обработки текстовых файлов
     Эти средства продолжают использоваться, так как каждое из них является прекрасным инструментом для выполнения тех задач, для которых они предназначены, однако все то, что можно выполнить, комбинируя эти средства, можно реализовать в одной Perl-программе, изучив только один язык. Но возможности Perl не ограничиваются только задачами администрирования. Подключаемые пакеты и модули позволяют легко и быстро решать и другие задачи, для которых, возможно, пришлось бы использовать язык программирования С. Начиная с версии 5.0, язык Perl поддерживает технологию объектно-ориентированного программирования, причем пакеты и модули можно оформить в виде объектов и использовать без знания содержащегося в них кода (хотя придется изучить большое количество объектных моделей со своими свойствами и методами).
     Perl — это язык, на котором программист может делать свою работу, причем для выполнения одной и той же задачи Perl предлагает несколько средств ее реализации. Одни из них более сложны, другие — менее. Разработчик может выбрать то, которое ему более понятно и которое ему проще применить, не тратя времени на изучение более сложных возможностей. В этом заключается простота использования Perl, которая позволяет применять его как для реализации одноразовых утилит, так и для создания сложных, часто используемых приложений.
     Perl является прямолинейным языком, а это означает, что простые программы не надо оформлять в виде головных процедур main, как это принято в большинстве процедурных языков программирования, или в форме класса, как принято в объектно-ориентированных языках программирования, т. е. не надо тратить время на дополнительное форматирование исходного текста программы, а просто начинать писать операторы Perl, которые будут немедленно обрабатываться интерпретатором. Именно в этом заключена эффективность языка программирования Perl.
     Четвертое преимущество использования Perl связана с его дополнительными возможностями, позволяющими выполнять не только традиционные задачи администрирования UNIX и обработки текстовых файлов.
     И здесь, в первую очередь, следует обратить внимание на простое включение в Peri-программу вызовов библиотечных процедур языка С, что позволяет использовать огромное количество кода, написанного для этого популярного языка. В поставку Perl входят утилиты, конвертирующие заголовки библиотек С в соответствующие эквиваленты языка Perl. Конвертирование осуществляется с помощью XS-интерфейса, который представляет собой простой программный интерфейс, преобразующий среду вызова функций С в среду вызова подпрограмм Perl. Последующий вызов функций С ничем не отличается от вызова подпрограмм самого Perl. Более того, программы Perl версии 5.0 легко интегрируются в приложения С и C++ через интерфейс, реализованный в наборе функций perl_call_* .
     Для работы с базами данных можно самому написать соответствующее приложение на языке С, а можно воспользоваться свободно распространяемыми модулями дополнительных расширений возможностей Perl, включающих работу с многочисленными популярными системами управления базами данных: Oracle, Ingres, Informix, Interbase, Postgre, Sybase 4 и др.
      Способность Perl работать с сокетами TCP/IP сделала его популярным для реализации информационных систем взаимодействия с сетевыми серверами любых типов, использующих сокеты в качестве механизма обмена информацией. Именно эта возможность в сочетании с использованием Perl для создания CGI-сценариев послужила широкому распространению языка на других многочисленных платформах.
     И в завершение перечисления достоинств Perl обратим внимание читателя на пятое преимущество его использования: так как изначально этот язык являлся свободно распространяемым, то вся наработанная документация также доступна совершенно бесплатно, а так как Perl, как язык сценариев очень популярен, то в Internet находится море документации по его применению для решения разнообразных задач.

Области применения Perl

    Наиболее широко Perl используется для разработки инструментов системного администрирования, однако в последнее время он получил огромную популярность в области разработки Internet-приложений: CGI-сценарии, системы автоматической обработки электронной почты и поддержки узлов Web. В этом параграфе мы кратко охарактеризуем возможности Perl в каждой из указанных областей.
Системная поддержка UNIX
      Как отмечалось ранее, именно задача соединения в одном языке программирования возможностей различных средств системного администрирования UNIX и послужила толчком к разработке и созданию языка Perl. Он и разрабатывался таким образом, чтобы оптимизировать решение именно этих задач, не прибегая к другим инструментам. На настоящий момент язык Perl является основным средством администрирования UNIX, который может выполнять работу нескольких других традиционных средств администрирования. Именно эта его универсальность и способствовала его широкому распространению среди системных администраторов и программистов UNIX, тем более, что он решает задачи обычно быстрее, чем другие аналогичные средства.
CGI-сценарии
      Одной из первых, но продолжающей и по настоящее время широко применяться в Интернете технологией реализации динамических эффектов является технология CGI-сценариев, суть которой заключается в обработке информации, получаемой от пользователя, которую он вводит в поля формы страницы HTML, просматриваемой с помощью программы-обозревателя Internet. Информация из полей формы пересылается на сервер с помощью протокола HTTP либо в заголовке, либо в теле запроса и обрабатывается сценарием, который после анализа полученных данных выполняет определенные действия и формирует ответ в виде новой страницы HTML, отсылаемой обратно клиенту. Сценарий может быть написан, собственно говоря, на любом языке программирования, имеющем доступ к так называемым переменным среды, но сценарии Perl получили наибольшее распространение из-за легкости создания и оптимизационных возможностей языка Perl при обработке текстовых файлов. В Internet можно найти буквально тысячи примеров динамического CGI-программирования на Perl.
     Его большая популярность для реализации подобных задач на UNIX-серверах Internet привела к тому, что разработчики серверов Internet, работающих в других операционных системах, стали включать возможность подключения сценариев Perl в свои системы. В настоящее время их можно использовать и на сервере Internet Information Server фирмы Microsoft для операционных систем семейства Windows, и на серверах Apache, NCSA и Netscape для операционной системы UNIX.
Обработка почты
      Другая популярная область применения Perl — автоматическая обработка электронной почты Internet. Сценарии Perl можно использовать для фильтрации почты на основе адреса или содержимого, автоматического создания списков рассылки и для решения многих других задач. Одной из наиболее популярных программ для работы с электронной почтой является программа Majordomo, полностью реализованная средствами Perl.
      Возможности Perl в этой области огромны и ограничиваются только фантазией разработчика. Можно, например, написать сценарий, который обрабатывает входящую почту и добавляет сообщения на заранее созданную страницу новостей, сортируя их по соответствующим тематикам, что позволяет быстро просматривать почту, не тратя время на чтение каждой полученной корреспонденции. По прошествии определенного времени сообщения удаляются со страницы.
Поддержка узлов Web
      Узел Web — это ничто иное, как структурированное хранилище страниц HTML, которые являются обычными текстовыми файлами в определенном специальном формате, понимаемом программами просмотра их содержимого. Perl оптимизирован для обработки большого количества текстовых файлов, — поэтому его использование для анализа и автоматического изменения содержимого узла Web само собой вытекает из тех задач, для решения которых он специально и создавался. Его, например, можно использовать для решения задачи проверки правильности перекрестных ссылок на страницах узла Web, как, впрочем, и для проверки правильности ссылок на другие узлы (правда, здесь придется воспользоваться его сетевыми возможностями работы с сокетами).
     Его возможности записи и чтения в/из сокетов позволяют использовать сценарии Perl для взаимодействия с другими узлами и получения информации на основе протокола HTTP. Следует отметить, что существуют даже серверы, написанные на Perl. Как упоминалось ранее, именно эти возможности Perl можно использовать для удаления со страниц HTML узла Web ссылок на несуществующие другие узлы.
      Perl может работать и с протоколом FTP. Это позволяет автоматизировать получение файлов с других узлов, а в сочетании с его возможностями обработки текстовых файлов позволяет создавать сложные информационные системы.
     В этой главе мы попытались кратко охарактеризовать сам язык Perl, очертить основные области его применения и привлечь внимание читателя к его дальнейшему изучению и внедрению в собственную практику. В конечном счете только сам программист решает, нужен ему соответствующий язык или нет.

Простая программа-приветствие

    Простая программа
     Изучение любого языка программирования начинается с его синтаксиса, одну из неотъемлемых частей которого составляет описание структуры программы, определяющей состав и порядок расположения разнообразных конструкций в теле программы. Мы не будем отступать от сложившихся традиций и объясним необходимые понятия на примере простой программы Perl, получающей информацию от пользователя и в ответ печатающей на экране монитора приветствие.
     Язык Perl — достаточно простой язык программирования, семантика ключевых слов которого соответствует их значению в английском языке, поэтому даже начинающий его изучение программист, во всяком случае, так утверждают его разработчики, без особого труда может разобраться в простой программе Perl. Ну, что ж, может быть так оно и есть, но, как говорится, "лучше один раз увидеть, чем сто раз услышать". Итак, в примере 2.1 приведен текст программы, которая печатает на экране монитора приглашение ввести имя пользователя, а в ответ просто приветствует его.
Пример 2.1. Простая программа-приветствие
01 #! /bin/usr/perl
02
03 print "Ваше имя?\n"; # Приглашение ввести имя.
04 $name = <STDIN>; # Ввод имени с клавиатуры.
05
06 $~ = NAME_FORMAT; # Назначение формата вывода.
07 write; # Вывод приветствия.
08
09 $~ = NAME_FORMAT_BOTTOM; # Вывод нижней разделительной черты.
10 write;
11
12 format NAME_FORMAT= # Начало описания формата.
13 Привет, @»»»»»»! # Строка вывода.
14 $name # Переменная, значение которой
# подставляется в строку вывода.
15 . # Завершение описания формата.
16
17 format NAME_FORMAT_TOP= # Заголовок формата NAME_FORMAT.
18 ================================
19 Сообщение Perl-программы
20
21 .
22
23 format NАМЕ_FОRМАТ_TОP= # Формат вывода нижней разделительной черты
24 ================================
25 .
     Эта программа не совсем типичная для Perl-программы — в ней отсутствуют операторы ветвления, цикла, определение собственных подпрограмм и их вызов и многое другое, но она все же отражает предназначение языка Perl как языка генерирования отчетов, осуществляя вывод приветствия в соответствии с технологией создания отчетов путем определения формата вывода, который в большинстве современных языков либо отсутствует вообще, либо практически не используется программистами.
     Если читатель по тексту программы уже понял, как она будет работать (надеемся, что наши комментарии помогли ему в этом), то теперь самое время проверить его догадку — выполнить эту программу. Но прежде следует в обычном текстовом редакторе набрать ее текст и сохранить в файле с расширением pl. Программы Perl являются обычными текстовыми файлами и для их создания можно использовать любой текстовый редактор: в UNIX, например, всегда доступные vi и ed, а в Windows — Блокнот (notepad.exe) или редактор программы Far.
Замечание
Обычно расширение файла (до трех символов) используется для идентификации файлов определенной группы: выполнимые файлы программ (ЕХЕ), файлы текстового процессора Word (DOC) и т. д. Для сценариев Perl принято использовать двухбуквенное расширение pl.
Для выполнения программы примера 2.1, сохраненной в файле programl.pl, в любой операционной системе, имеющей командную строку, достаточно набрать в ней команду:
perl program1.pl
     В результате выполнения программы на экране монитора появится приглашение ввести имя и после ввода имени отобразится приветствие Perl- программы. Дамп экрана после выполнения нашей программы можно увидеть в примере 2.2, где мы полужирным шрифтом выделили ввод пользователя.
Пример 2.2. Вывод программы примера 2.1
Ваше имя?
Александр
==========================
Сообщение Perl-программы
Привет, Александр!
==========================
     Соответствует ли он вашим соображениям относительно работы этой программы при анализе ее текста? Если да, то мы вас поздравляем, если нет — не надо отчаиваться, несколько наших комментариев поставят все на свои места.
     Первый оператор — это специальный комментарий, который для системы UNIX определяет местонахождение интерпретатора perl. Дело в том, что в этой операционной системе можно сделать любой файл выполняемым с помощью команды
chmod +x programl.pl
и запустить на выполнение из командной строки:
./programl.pl
     В этом случае первая строка программы сопоставляет файлу приложение, которое должно быть загружено для его обработки. Более того, в ней можно определить при необходимости параметры, или ключи, определяющие режим работы приложения, в нашем случае интерпретатора perl. Можно задать отображение предупреждающих сообщений или загрузку отладчика в случае обнаружения серьезной ошибки с помощью следующей строки:
#! /bin/usr/perl -w -d
Замечание
При работе в операционной системе Windows можно ассоциировать с расширением файла определенную программу, которая будет вызываться при двойном щелчке мышью на любом файле с таким расширением. Программа установки интерпретатора языка Perl фирмы ActiveState Tool Corp., который называется Active Perl, автоматически устанавливает соответствие файлов с расширением рl и интерпретатора языка Perl. При двойном щелчке на файле сценарий действительно выполняется в окне DOS, которое, однако, автоматически закрывается после выполнения последнего оператора, что не позволяет просмотреть отображенные в нем результаты. Чтобы этого не происходило, следует заменить строку вызова приложения, генерируемую программой установки, на следующую:
C:\WINDOWS\Dosprmpt.pif /Полный__путь\perl.exe
     Для этого следует выполнить команду Параметры меню Вид программы Проводник, в диалоговом окне Параметры на вкладке Типы файлов в списке Зарегистрированные типы выделить Perl File и нажатием кнопки Изменить отобразить диалоговое окно Изменение свойств типа файлов. В этом окне в списке Действия выбрать Open и нажать кнопку Изменить. В появившемся диалоговом окне Изменение действия для типа: Perl File в поле Приложение, исполняющее действие: ввести указанную строку, задав в ключе /с полный путь к папке, где расположен двоичный исполняемый файл интерпретатора Active Perl, который называется perl.exe.
     При работе с интерпретатором Active Perl нет необходимости задавать первую строку, однако если необходимо установить режимы работы интерпретатора, то ее следует задать, причем не обязательно указывать полный путь расположения интерпретатора, достаточно только его имя perl и необходимые ключи.
Внимание
Все примеры программ в этой книге проверены в интерпретаторе Active Perl 520 для Windows 95/NT и встроенном интерпретаторе Perl системы Linux RedHat 6.1, соответствующих текущей стабильной версии Perl 5.005. Вообще любой комментарий в языке Perl начинается с символа "#" и распространяется до конца строки. Единственное исключение — это если сразу же после символа комментария следует символ "!".
Внимание
В строке специального комментария не следует вводить ничего, кроме пути местонахождения интерпретатора и его ключей. В противном случае можно получить сообщение об ошибке.
     В строке 3 функция print посылает на системное устройство вывода (обычно это монитор компьютера) содержимое списка своих параметров, при необходимости преобразуя его в символьное представление. В нашей программе при выполнении этого оператора на экране монитора отобразится содержимое строки, передаваемой функции print в качестве параметра. Для тех, кто не знаком с языком С, последовательность символов "\n" может показаться странной, тем более, что в дампе экрана (см. пример 2.2) она даже не отображается. Это одна из так называемых управляющих или ESC- последовательностей, которые предназначены для представления неотображаемых символов — в. данном случае символа перехода на новую строку.
      Оператор строки 4 ожидает ввод со стандартного устройства ввода (обычно это клавиатура) и присваивает переменной $name введенное пользователем имя. Забегая вперед, скажем, что при работе с файлами в Perl определяются дескрипторы файлов, представляющие собой обычные идентификаторы, используемые в программе для ссылки на файлы, с которыми они ассоциированы. В языке имеется несколько предопределенных дескрипторов файлов, одним из которых является STDIN , ассоциированный со стандартным устройством ввода. Операция о выполняет ввод из файла, заданного своим дескриптором.
      Оператор строки 6 назначает системной переменной $~ имя используемого формата для выполнения вывода на стандартное устройство вывода системной функцией write из строки 7. Сам формат задается в строках 12-15 оператором format , в котором определяется имя формата ( NAME_FORMAT ), завершающееся символом равенства "=". В последующих строках до строки 15, содержащей единственный символ точка ".", фиксирующий завершение объявления формата, задается сам формат, который обычно представляет собой повторяющуюся последовательность двух строк: строки вывода и строки, перечисляющей через запятую переменные, чьи значения при выводе подставляются вместо поледержателей, объявленных в строке вывода. Строка вывода представляет собой именно строку, которая выводится функцией write в определяемый ее параметром файл (если параметр не задан, то вывод осуществляется на стандартное устройство вывода). В этой строке значащими являются все пробельные символы (сам пробел, символы перехода на новую строку и страницу, символ табуляции). Поледержатель — это специальная конструкция в строке вывода, начинающаяся с символа "@", за которым следует определенное количество специальных символов, задающих длину поля, в которое выводится значение переменной, ассоциированной с поледержателем и определенной в списке переменных, задаваемом в строке, непосредственно следующей за строкой вывода. Если в строке вывода поледержателей нет, то строку со списком ассоциированных с ними переменных задавать не надо.
      В формате NAME_FORMAT определена одна строка вывода с одним поледержателем, который резервирует поле длиной в 12 символов и определяет, что выводимое значение должно быть прижато вправо (символ ">"). Это означает, что если значение ассоциированной с этим поледержателем переменной $name будет меньше 12 символов, то в этом поле при выводе они будут выровнены по правому краю. Если выводимое значение преобразуется в строку длиной более 12 символов, она обрезается по правому краю, т. е. отображаются первые 12 символов, считая слева направо.
     Если для формата определен формат с таким же именем и суффиксом _ТОР, то этот формат определяет вид заголовка страницы, который будет отобра жаться всякий раз при выводе новой страницы с использованием основного формата. Для формата NAME_FORMAT определен формат заголовка в строках 17-19.
   Завершается вывод приветствия печатанием разделительной черты функцией write строки 10 с использованием формата NAME_FORMAT_BOTTOM. Обратите внимание, что для использования нового формата вывода нам пришлось изменить значение системной переменной $~. Это следует делать всякий раз, когда необходимо организовать вывод с помощью нового формата.

Объявления и комментарии

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

      Объявления форматов и подпрограмм являются глобальными, а это означает, что они "видимы" из любого места сценария. Объявления могут располагаться в программе в любом месте, куда можно поместить оператор, но обычно их размещают либо в начале, либо в конце программы, чтобы быстро найти и откорректировать в случае необходимости. Объявления обрабатываются во время компиляции и не влияют на выполнение последовательности операторов, когда откомпилированный во внутренний код интерпретатора сценарий начинает свою работу.
     В Perl нет специального оператора объявления переменной, она определяется при первом ее использовании, причем с помощью ключа - w интерпретатора можно задать режим отображения предупреждающих сообщений при попытке использования не инициализированной переменной. Переменные можно определять как глобальные, видимые из любой точки программы, так и с помощью функции ту как локальные, видимые в определенной части программы — блоке.
     Можно объявить подпрограмму с помощью оператора sub , не определяя ее, т. е. не задавая операторы, реализующие ее функцию. После такого объявления подпрограммы ее имя можно использовать как операцию, действующую на список, определяемый передаваемыми ей параметрами.
     Как уже отмечалось выше, если интерпретатор встречает символ #, то он игнорирует любой текст, расположенный за ним. Такая конструкция называется комментарием и ее действие распространяется до конца строки после символа #. Комментарии используются для документирования программы и не следует ими пренебрегать, так как они вносят ясность в понимание того, что выполняет программа. Однако и злоупотреблять ими не следует, так как слишком большое их количество может ухудшить читаемость программы — одну из важных характеристик любой программы.
     Комментарии располагаются в любом месте программы. Их можно разместить непосредственно после оператора в той же самой строке, как в нашем примере 2.1, или занять ими всю строку, если первым символом в ней является символ комментария #. Если необходимо временно исключить из потока выполняемых операторов какой-либо из них, то его можно просто закомментировать, не забыв, правда, удалить символ комментария, когда этот оператор снова надо будет включить в поток вычислений.

Выражения и операторы

    Оператор — это часть текста программы, которую интерпретатор преобразует в законченную инструкцию, выполняемую компьютером. С точки зрения синтаксиса языка (способов составления правильных конструкций, распознаваемых интерпретатором) оператор состоит из лексем — минимальных единиц языка, которые имеют определенный смысл для интерпретатора. Под минимальной единицей языка понимается такая его единица, которая не может быть представлена более мелкими единицами при дальнейшем ее синтаксическом разборе. В языке Perl лексемами могут быть идентификаторы, литералы, знаки операций и разделитель.
     Мы дадим определения всем допустимым в языке лексемам. Хотя их семантика (смысл) может оказаться для начинающих программистов и не совсем ясна, но мы вернемся к некоторым определениям в последующих главах, где уточним их и синтаксис, и семантику в связи с вводимыми элементами языка. Дело в том, что, к сожалению, невозможно описать язык без ссылок вперед.
     Идентификатор — это последовательность букв, цифр и символа подчеркивания "_", начинающаяся с буквы или подчеркивания и используемая для именования переменных, функций, подпрограмм, дескрипторов файлов, форматов и меток в программе. Программист может использовать любые правиль ные идентификаторы для именования перечисленных объектов программы, если только они не совпадают с ключевыми словами языка — предопределенными идентификаторами, которые имеют специальное значение для интерпретатора языка Perl, например if, unless, goto и т. д. Примеры правильных и неправильных идентификаторов представлены в примере 2.3.
Пример 2.3. Правильные и неправильные идентификаторы
# Правильные идентификаторы
myNamel
my_Namel
_myName__l
# Неправильные идентификаторы
1 myName # Начинается с цифры.
-myName # Начинается не с символа буквы или подчеркивания.
my%Name # Используется недопустимый для идентификаторов символ
my # my является зарезервированным словом.
Замечание
Забегая вперед, скажем, что так как имена переменных Perl начинаются со специального символа (" $ ", " @ ", " % "), определяющего их тип, после которого следует идентификатор, то в этом случае использование идентификатора, совпадающего с ключевым словом Perl, является правомочным и не вызывает ошибку интерпретатора. Так, следующие имена переменных являются допустимыми: $print , @do , %if , однако подобная практика не рекомендуется. Это замечание не относится к идентификаторам, используемым для именования дескрипторов файлов и меток, имена которых не начинаются с определенных символов.
     Литерал, или буквальная константа, — символ или слово в языке программирования, определяющие в отличие от переменной свое собственное значение, а не имя другого элемента языка. Буквальные константы тесно связаны с типами данных, представимыми в языке, и являются, собственно говоря, их представителями. В Perl литералами являются числа и строки.
123 # Целое число.
23.56 # Вещественное число с фиксированной точкой.
2Е+6 # Вещественное число с плавающей точкой.
"Язык Perl" # Строковый литерал.
     Знаки операций — это один или более специальных символов, определяющих действия, которые должны быть выполнены над величинами, называемыми операндами. Выполняемые действия называются операциями, которые могут быть унарными (применяются к одному операнду), бинарными (применяются к двум операндам) и тернарные (участвуют три операнда).
Пример 2.5. Операции языка Perl
++$п; # Унарная операция (++)
23 * $п; # Бинарная операция (*)
$п >= 3 ? print "true" : print "false"; # Тернарная операция (?:)
     Разделитель — это символ ";", которым завершается любой оператор и который сообщает об этом интерпретатору. Использование разделителя позволяет на одной строке задавать несколько операторов, хотя это и не принято в практике программирования, так как ухудшает читаемость текста программы.
     В операторе все его лексемы могут отделяться любым числом пробельных символов, к которым относятся сам пробел, знак табуляции, символ новой строки, возврат каретки и символ перехода на новую строку. Поэтому один оператор можно записать на нескольких строках и для этого не надо использовать никакого символа продолжения, требующегося в других языках программирования. Например, оператор номер 4 присвоения данных, введенных с клавиатуры, из примера 2.1 можно записать и так:
Пример 2.6. Использование пробельных символов в операторе
$name
= <STDIN>
;
     Можно вообще не использовать пробельные символы в операторе, но для обеспечения читаемости программы мы рекомендуем отделять лексемы одним пробелом, тем более что могут встречаться ситуации, когда интерпретатор не однозначно выделяет лексемы из непрерывного потока символов.
Замечание
Так как пробельные символы не являются значащими в Perl, то обычно их используют для структуризации текста программы, которая заключается в написании некоторой группы операторов, логически подчиненных некоторой конструкции языка, с некоторым отступом относительно этой конструкции. Например, подобный подход можно применить к блоку операторов, выполняющихся в конструкции цикла, сдвинув все их вправо относительно этой конструкции. Структуризация текста программы способствует ее лучшему прочтению и широко практикуется программистами многих языков программирования, например языка С.
     Операторы в языке Perl могут быть простыми или составными. Простой оператор — это выражение, завершающееся разделителем точкой с запятой ",-", и которое вычисляется исключительно ради своего побочного эффекта. Что такое побочный эффект выражения мы определим немного позже, а сейчас остановимся на понятии "выражение".
     Выражение — последовательность литералов, переменных и функций, соединенных одной или более операцией, которые вычисляют скаляр или массив, т. е. при обработке интерпретатором выражения единственным действием является вычисление значения, а не выполнение некоторых других действий, например присвоение переменной нового значения. При вычислении выражения могут проявляться побочные эффекты, когда при вычислении выражения меняется значение переменной, входящей в выражение. Они могут вызываться, например, операциями увеличения (++) и уменьшения (--) или при вызове функции, которая изменяет значение своего фактического параметра. Как упоминалось выше, простой оператор и выполняется, чтобы реализовать этот побочный эффект, иначе какой смысл просто вычислить выражение, значение которого никоим образом нельзя использовать.
Пример 2.7. Простые операторы
++$n; # Значение переменной $n увеличивается на единицу.
123*$n; # Простой оператор без побочного эффекта.
     Каждый простой оператор может иметь модификатор, который располагается после выражения перед завершающей точкой с запятой. Модификаторы представляют собой ключевые слова if , unless , while и until , за которыми следует некоторое выражение. Семантика использования модификатора заключается в том, что простой оператор выполняется, если истинно или ложно выражение, стоящее после модификатора, в зависимости от используемого модификатора. Модификаторы употребляются так же, как и в обычном разговорном английском языке. Например, простой оператор
$n++ while <STDIN>;
будет выполняться, увеличивая всякий раз значение переменной $n на единицу, пока пользователь будет осуществлять ввод с клавиатуры. Остановить выполнение этого оператора можно вводом комбинации клавиш <Ctrl>+<Z>ium <Ctrl>+<C>.

Замечание
Язык Perl вобрал в себя лучшие элементы других языков программирования, в основном С. Конструкция модификаторов заимствована из умершего языка BASIC/PLUS фирмы Digital Equipment Corp.
     Чтобы определить конструкцию, называемую составным оператором, нам придется сначала ввести понятие "блок". Последовательность операторов Perl, определяющая область видимости переменных, называется блоком. После знакомства с переменными это определение не будет таким туманным, каким оно может показаться сейчас начинающему программисту. Для целей этой главы достаточно мыслить блок как последовательность операторов, заключенную в фигурные скобки:
{ оператор_1;
оператор_n; }
Составной оператор определяется в терминах блока и может быть одного из следующих видов:

Пример 2.8. Составные операторы
if (выражение) БЛОК
if (выражение) БЛОК_1 else БЛОК__2
if (выражение_1) БЛОК_1 elsif (выражение_2) БЛОК_2 ... else БЛОК_п
МЕТКА while (вьражение) БЛОК
МЕТКА while (вьражение) БЛОК_1 continue ЕЛОК_2
МЕТКА for (вьражение_1; выражение_2; аьражение_3) БЛОК
МЕТКА foreach переменная (список) БЛОК .МЕТКА БЛОК_1 continue БЛОК_2
     Обратим внимание читателя на то, что, в отличие от языков программирования С и Pascal, составные операторы Perl определяются в терминах блоков, а не в терминах операторов. Это означает, что там, где нужен блок, он всегда должен задаваться с помощью фигурных скобок. В составных операторах, если даже блок состоит из одного оператора, он должен быть заключен в фигурные скобки. Такой синтаксис не приводит к двусмысленностям и, например, во вложенных операторах условия всегда ясно, с каким if согласуется else или elsif . Метка, представляющая собой идентификатор с двоеточием ":", в составных операторах не обязательна, но если она присутствует, то имеет значение для операторов управления циклами next , last и redo.

Алфавит языка

    Приступая к знакомству с любым языком программирования, мы прежде всего выясняем, а какие типы данных он позволяет обрабатывать, предоставляет ли язык механизм создания новых типов из уже существующих. Ведь язык программирования, как знаковая система обработки информации, как раз и предназначен для обработки информации, представленной данными и алгоритмами. Данные определяются своим типом — множеством значений и набором допустимых операций. Одни языки программирования предлагают большое число разнообразных типов данных, как, например, универсальный язык С, в котором даже тип данных, используемый для хранения символов, может быть со знаком или без знака; другие могут обходиться всего лишь двумя типами данных, как, например, VBScript, в котором для хранения и обработки любых скалярных данных (числовых, строковых и булевых) используется единственный вариантный тип данных и существует возможность создания массивов скалярных данных. В конечном счете, язык должен иметь такое разнообразие типов данных, чтобы программист мог с их помощью решать задачи, для которых предназначен язык программирования.
     Язык Perl для решения своих задач предлагает всего три типа данных: скаляры, массивы скаляров и ассоциативные массивы скаляров, или хеши. В соответствии с допустимыми типами данных существует и три типа переменных, в которых можно хранить данные перечисленных типов. В этой главе определяются все допустимые в языке типы данных, вводятся числовые и строковые литералы, конструкторы массивов и ассоциативных массивов, а также обсуждаются переменные и их использование, но начнем мы наше изучение с вопроса, без которого невозможно вхождение в любой язык программирования — набора допустимых символов, или алфавита языка.
      С чего начинается изучение любого языка? Конечно, с алфавита. Помните, как в первом классе мы усердно выводили в прописях все буквы русского алфавита, а в старших классах, приступая к изучению иностранного языка, мы сначала учили буквы его алфавита и какие звуки они обозначают, а потом из букв складывали слова, которые уже можно было использовать для составления предложений, несущих определенную информативность: "Мама мыла раму".
     Аналогично происходит и при изучении языков программирования. Сначала мы должны выяснить, какие можно использовать символы для составления лексем (слов языка), из которых можно конструировать операторы (предложения языка).
     В языке Perl можно использовать все буквы латинского алфавита (прописные и строчные), арабские цифры и знак подчеркивания "_". Perl относится к языкам, чувствительным к регистру. Это означает, что символы прописной и строчной буквы считаются различными. Поэтому, например, два идентификатора one и one, используемые для задания имени переменной, — это два различных идентификатора и следовательно, определяемые ими переменные одного и того же типа также являются различными.
Замечание
Буквы национальных алфавитов, в частности русского, можно использовать только в строковых данных. Идентификаторы переменных могут содержать буквы только латинского алфавита. Кроме букв, цифр и символа подчеркивания, которые называются алфавитно-цифровыми символами, используется набор специальных символов, представленный в табл. 3.1.
Таблица 3.1. Специальные символы языка Perl
Символ Название Символ Название
` Обратный апостроф ~ Тильда
! Восклицательный знак @ Коммерческое AT
Номер $ Знак доллара
% Процент ^ "Крышка"
& Амперсанд * Звездочка
- Минус + Плюс
= Равенство | Вертикальная черта
' Прямой апостроф " Кавычки
< Меньше >  Больше
/ Косая черта \ Обратная кос. черта
, Запятая . Точка
: Двоеточие ; Точка с звпятой
[ Квадрат. лв. скобка ] Квадрат. пр. скобка
{ Фигурная лв. скобка } Фигурная пр. скобка
( Круглая лв. скобка ) Круглая пр. скобка
? Вопросительный знак Пробел
     Анализ специальных символов показывает, что в языке Perl используются все символы, которые можно ввести с клавиатуры. Если буквенно-цифровые символы используются в составе идентификаторов, то специальные символы служат для определения знаков операций, уточнения синтаксиса выражений, а также именования специальных встроенных переменных языка Perl. Если читателю какой-то из перечисленных объектов сейчас и не совсем ясен, то при последующем изложении все встанет на свои места. Алфавит языка используется для создания "правильных" (распознаваемых интерпретатором языка) лексем. Среди всего множества таких лексем существует подмножество предопределенных лексем, называемых ключевыми словами и используемых для создания правильных конструкций языка.
Набор ключевых слов языка Perl не велик и представлен ниже:
if, elseif, else, unless, while, until, foreach, for, next, continue, last, do, eval, goto, sub, my, return
     Кроме перечисленных ключевых слов, определяющих синтаксические языковые конструкции, в языке Perl сложился набор стандартных функций, который реализован в любом интерпретаторе perl. Имена этих функций можно тоже считать зарезервированными словами языка и не использовать в качестве имен пользовательских функций или меток в программе. Мы не будем здесь перечислять имена всех стандартных функций, так как их количество достаточно велико, да и мало прока будет от такого простого перечисления, а отошлем читателя к приложению А, где он может увидеть имена всех стандартных функций.

Скалярный тип данных

    Скалярный тип данных в Perl предназначен для представления и обработки числовых данных (чисел) и последовательности символов, называемых строками. Для задания в программе перечисленных данных используются буквальные константы, или литералы: числовые и строковые.
     Числовые литералы используются для представления обычных чисел, необходимых для реализации какого-либо алгоритма в программе Perl. Обычно используются числа с основанием десять, или десятичные числа, но язык позволяет использовать и восьмеричные (с основанием восемь), и шестнадцатеричные (с основанием шестнадцать) числа, которые полезны при работе с содержимым памяти компьютера в процессе решения некоторых системных задач.
     Десятичные числа могут быть целыми или вещественными с дробной частью, которые в программировании часто называют числами с плавающей точкой из-за способа их представления и хранения в памяти компьютера. Соответствующие им литералы ничем не отличаются от записи подобных чисел в математике: последовательность цифр без пробелов для целых чисел и последовательность цифр, в которой точка отделяет целую часть от дробной, для вещественных чисел (пример 3.1).
Пример 3.1. Числовые литералы
123 # Целое десятичное число.
234.89 # Вещественное число.
0.6780 # Вещественное с нулевой целой частью
678 # Незначащие нули можно не задавать
1_000_000.67 # Для отделения разрядов в целой части числа
# можно использовать символ подчеркивания.
Для вещественных чисел с плавающей точкой можно использовать и экспоненциальную форму записи:
[цифры] . [цифры] [Е | е] [+1 -] [цифры]
     Эта форма записи означает, что для получения значения числа следует его мантиссу, заданную в форме действительного числа с точкой ([цифры]. [цифры]), умножить на десять в степени числа со знаком, заданного в его экспоненциальной части после символа Е или е (пример 3.2).
Пример 3.2. Экспоненциальная форма записи вещественных чисел
10.67Е56 # Знак "+" в экспоненте можно опускать.
10.67е+06 # Так экспонента лучше читаема.
1е-203 # Число близко к машинному нулю.
1е+308 # Число близко к бесконечно большому числу.
Замечание
Интерпретатор языка Perl представляет все числа (и целые, и вещественные) в формате чисел с плавающей точкой удвоенной точности. Это означает, что реально нельзя задать больше шестнадцати значащих цифр мантиссы, а экспонента ограничена диапазоном от -323 до +308. Интерпретатор не сгенерирует ошибки, если мантисса будет превосходить 16 цифр, а экспонента 3 цифры, но при отображении таких чисел мантисса будет приведена к шестнадцати значащим цифрам. Если экспонента меньше нижнего предела, то будет выводиться нуль, а если больше верхнего предела, то используется специальный символ 1.#INF, обозначающий бесконечно большое число. Подобный алгоритм представления очень больших и очень маленьких чисел не приводит к возникновению, соответственно, ошибок переполнения и исчезновения порядка, свойственной многим языкам программирования. Если задать целое число с числом значащих цифр больше 15, то при выводе оно будет отображаться как вещественное в экспоненциальной форме.
     Некоторые системные установки или анализ некоторых системных параметров легче осуществлять с использованием чисел, представленных в восьмеричной или шестнадцатеричной системах счисления. Форма записи таких чисел аналогична их синтаксису в языке С: любое целое число, начинающееся с нуля "о", трактуется интерпретатором как восьмеричное целое число, а символы, непосредственно следующие за комбинацией "Ох", рассматриваются как шестнадцатеричные цифры. При использовании восьмеричных чисел следует помнить, что в них не может быть цифры больше, чем 7, а в шестнадцатеричных числах кроме десяти цифр от о до 9 используются буквы А или а, в или ь, с или с, о или d, Е или е, F или f для обозначения недостающих цифр числа (пример 3.3).
Пример 3.3. Восьмиричные и шестнадцатиричные числа
010 # Восьмеричное 10, равное десятичному 8.
0x10 # Шестнадцатеричное 10, равное десятичному 16.
0239 # Вызовет ошибку интерпретации: нельзя использовать цифру 9.
OxAIFf # Соответствует 41477 десятичному.
OxGA # Вызовет ошибку интерпретации: нельзя использовать букву G.
Замечание
Задание шестнадцатеричных цифр — это единственный случай в Perl, когда прописные и строчные буквы идентичны. В других случаях их употребления, например в идентификаторах, они различны.
Внимание
Нельзя вместо последовательности символов "Ох", идентифицирующей шестнадцатеричные числа, использовать последовательность "ох".
     Строковые литералы, или просто строки, представляют последовательность символов, заключенную в одинарные ('), двойные (") или обратные (') ка вычки, которая рассматривается как единое целое. Использование одинарных и двойных кавычек для задания строк аналогично их применению для этих же целей в системе UNIX.
     В строке, ограниченной одинарными кавычками, нельзя использовать ESC-, или управляющие последовательности, а также в нее нельзя подставить значение переменной. Единственное исключение составляют две управляющие последовательности: (V) и (\\). Первая используется для отображения одинарной кавычки в самой строке, так как иначе интерпретатор рассматривал бы первую, встретившуюся ему одинарную кавычку как признак завершения строки, что не соответствовало бы ее включению в строку. Вторая последовательность используется для отображения самой обратной косой черты. Примеры задания строковых литералов, ограниченных одинарными кавычками, можно найти в табл. 3.2.

Таблица 3.2. Символьные литералы, ограниченные одинарными кавычками
Строка Отображение Комментарий
'Простая строка #1' Простая строка #1 Строка без управляющих последовательностей
'Vperl.exeV ' 'perl.exe' Строка с одинарными кавычками
'D: \\perl.exe' D: \perl . ехе Строка с обратной дробной чертой
'Последовательность \n' Последовательность \n Управляющая последовательность \n не влияет на отображение строки
'Завтрак Бутерброд с ветчиной Чашка кофе ' Завтрак Бутерброд с ветчиной Чашка кофе Многострочный символьный литерал отображается в нескольких строках
Замечание
Esc-последовательности, состоящие из обратной, косой черты (\), за которой следует буква или комбинация цифр. В них символ обратной косой черты рассматривается как символ, изменяющий значение буквы. Они вместе являются одним целым и выполняют определенное действие при выводе на устройство отображения, например, переход на новую строку (\п). Комбинация цифр трактуется как ASCII-код отображаемого символа. Название таких последовательностей происходит от английского слова "escape", означающего изменять смысл. Их еще называют управляющие последовательности.
     Строковый литерал может распространяться на несколько строк программы (см. последний литерал табл. 3.2). Для этого при его вводе с клавиатуры следует использовать клавишу <Enter> для перехода на новую строку.
      Многострочные литералы отображаются на стольких строках, на скольких они заданы. Это означает, что символ перехода на новую строку, введенный с клавиатуры, сохраняется в символьном литерале, ограниченном одинарными кавычками. Следует заметить, что это справедливо и для строковых литералов, ограниченных двойными кавычками.
     Строки в двойных кавычках позволяют вставлять и интерпретировать управляющие последовательности, а также осуществлять подстановку значений переменных, содержащих скаляры или списки. Управляющие последовательности (табл. 3.3) при выводе строк могут интерпретироваться как символы новой строки, табуляции и т. п., а могут изменять регистр следующих за ними букв.

Таблица 3.3. Управляющие последовательности
Управляющая последовательность Значение
\a Звонок
\b Возврат на шаг
\e Символ ESC
\f Перевод формата
\n Переход на новую строку
\r Возврат каретки
\t Горизонтальная табуляция
\v Вертикальная табуляция
\$ Знак доллара
\@ Амперсанд или AT коммерческое
\0nnn Восьмеричный код символа
\xnn Шестнадцатеричный код символа
\cn Эмулирует нажатие комбинации клавиш + . Например, \сС соответствует +
\l Переводит следующий символ в нижний регистр
\u Переводит следующий символ в верхний регистр
\L Переводит следующую за ней последовательность символов, ограниченную управляющей последовательностью \Е , в нижний регистр
\Q В следующей за ней последовательности символов, ограниченной управляющей последовательностью \Е , перед каждым не алфавитно-цифровым символом вставляет обратную дробную черту
\U Переводит следующую за ней последовательность символов, ограниченную управляющей последовательностью \Е , в верхний регистр
\E Ограничивает действие управляющих последовательностей \L, \Q И \U
\\ Символ обратной дробной черты
\" Двойные кавычки
\' Одинарные кавычки
Замечание
Если после обратной косой черты в строковом литерале, ограниченном двойными кавычками, следует символ, который не составляет с ней управляющую последовательность, то обратная косая черта не отображается при выводе строки на устройство отображения.
     Строковые литералы в двойных кавычках удобно использовать для структурированного вывода текстовой информации, заданной одной строкой. Примеры строк в двойных кавычках представлены в табл. 3.4.

Таблица 3.4. Символьные литералы, ограниченные двойными кавычками
Строка Отображение Комментарий
"'\Uline\E #1" LINE #1 Управляющие последовательности перевода регистра \l, \u, \L и \и действуют только на буквы латинского алфавита и не применимы к буквам русского алфавита
"Конец страницы\f" Конец страницы При выводе на экран монитора или в файл в конце строки отображается символ перехода на новую страницу; при выводе на принтер печать начинается с новой страницы после вывода этой строки
"\t3aвтpaк\nБyтepброд с ветчиной\пЧашка кофе\n" Завтрак Бутерброд с ветчиной Чашка кофе Символьный литерал задан одной строкой с управляющими символами
      Последней разновидностью строковых литералов являются строки в обратных кавычках, которые, по существу, не являются строками данных в том смысле, что содержащиеся в них символы не обрабатываются при выводе интерпретатором языка Perl как некоторый поток отображаемых символов. Встретив строку в обратных кавычках, интерпретатор передает ее на обработку операционной системе, под управлением которой он функционирует: Windows, UNIX или какая-либо другая, которая выполняет переданную ей команду и возвращает в программу Perl результаты ее выполнения в виде строки, которую в дальнейшем можно использовать для организации вычислений. Таким образом, строки в обратных кавычках должны содержать значимую для операционной системы последовательность символов: команду операционной системы, строку загрузки приложения и т. п. Например, при выводе строки ~dir~ оператором print отобразится не слово "dir", a результат выполнения команды dir операционной системы. В системе Windows эта команда отобразит содержимое текущей папки (пример 3.4).
Том в устройстве D не имеет метки Серийный номер тома: 1F66-19F2 Содержимое каталога D:\PerlOurBook
<КАТАЛОГ> 09.01.00 16:01 .
<КАТАЛОГ> 09.01.00 16:01 ..
EXAMPLE PL 32 23.01.00 11:56 exarrple.pl
01 <КАТАЛОГ> 11.01.00 14:12 01
02 <КАТАЛОГ> 11.01.00 14:12 02
03 <КАТАЛОГ> 11.01.00 14:12 03
PERLINF ТХТ 1 781 12.01.00 11:39 perlinf.txt
EXAMPLE1 PL 347 18.01.00 18:02 examplel.pl
3 файл(а,ов) 2 160 байт
5 каталог(а,ов) 78 086 144 байт свободно

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

Замечание
Некоторые символы (их еще называют метасимволы) имеют специальное значение для командной оболочки. К ним относятся *,- <, >, ?, | и &. В системе UNIX, чтобы изменить интерпретацию метасимвола как символа со специальным значением, ставят перед ним обратную косую черту, которая изменяет (escape) его специальное назначение. Теперь он рассматривается командной оболочкой просто как символ, представляющий самого себя. Если во вводимой строке много таких специальных символов, то пользователю необходимо перед каждым поставить обратную косую черту, что приводит к плохой читаемости всей строки. Во избежание подобных "затруднений" в UNIX используются строки в одинарных кавычках, в которых все символы интерпретируются так, как они есть. Подобную же функцию одинарные кавычки выполняют и в языке Perl.
     При работе в UNIX широко используется подстановка значений переменных в строку команды, которая передается на обработку оболочке shell. При задании команды в строке ввода используются строки в двойных кавычках, которые так же, как и строки в одинарных кавычках, отменяют специальные значения метасимволов, за исключением символа $, который используется для подстановки значения переменной. Обратная косая черта перед ним изменяет его специальное значение. Именно этот механизм строк в двойных кавычках послужил прототипом для аналогичных конструкций в языке Perl.

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

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

      Более того, переменная определяет тип данных, хранимых в области памяти, на которую она ссылается. В большинстве языков программирования переменные до их использования в программе объявляются как переменные определенного типа, информируя транслятор, что в них можно хранить данные соответствующего типа. Как мы помним, в Perl нет операторов объявления переменных определенного типа; они автоматически объявляются при первом их использовании в конструкциях языка, например в операторе присваивания значения переменной. Любая переменная определяется заданием своего имени, которое представляет собой правильный идентификатор языка. В Perl имя любой переменной состоит из специального символа (префикса), определяющего тип переменной, за которым следует идентификатор. Для переменных скалярного типа (пример 3.5), или просто скалярных переменных, таким определяющим символом является знак доллара "$".

# Правильные имена скалярных переменных. $Name; $name_surname; $name_l;
# Неправильные имена скалярных переменных.
$l_name; # Идентификатор не может начинаться с цифры.
$Name@Surname; # Недопустимый символ @

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

$s = "\$10";
$п = "Книга стоит $s долларов.";
print $n;
отобразит на экране монитора строку
Книга стоит $10 долларов.

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

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

$day = 'пятницу';
$number = 5;
$html = "HTML";
$s = "${html}-документ отослан B\n$day\t$number февраля.";
print $s;

Результатом выполнения этого фрагмента будет отображение двух строк на экране монитора:

HTML-документ отослан в пятницу 5 февраля.

      Переменная $htmi подставляется с явным указанием ее идентификатора, для выделения идентификаторов остальных переменных используются разделители.

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

Замечание
Рассмотренные в этом параграфе различные типы кавычек для задания строковых литералов на самом деле являются всего лишь удобной формой записи операций языка Perl: q//, qq/7, qx/7.
     Синтаксический анализатор языка Perl при анализе текста программы выделяет слова (не заключенная в кавычки последовательность алфавитно-цифровых символов) и определяет их принадлежность набору ключевых слов. Если слово не является ключевым, то интерпретатор рассматривает его как строку символов, заключенную в кавычки. Это позволяет задавать строковые литералы, не заключая их в кавычки:

$day = Friday; # Тождественно оператору $day = 'Friday';

Такие слова без кавычек в тексте программы иногда еще называют простыми словами (barewords).

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

      Завершая разговор о литералах, следует упомянуть о специальных литералах языка Perl: _LINE_, _FILE_, _END_ и _DATA_. Они являются самостоятельными лексемами, а не переменными, поэтому их нельзя вставлять в строки. Литерал _LINE_ представляет номер текущей строки текста программы, а _FILE_— имя файла программы. Литерал _END_ используется для указания логического конца программы. Информация, расположенная в файле программы после этого литерала, не обрабатывается интерпретатором, но может быть прочитана через файл с дескриптором DATA. Последний литерал _DATA_ аналогичен литералу _END_, только дополнительно он открывает файл с дескриптором DATA для чтения информации, находящейся в файле программы после него. Программа примера 3.6 демонстрирует использование специальных литералов.

#! /per!520/bin/perl -w
$file = _FILE_;
$prog = _LINE_;
print "Находимся в строке: $prog\n",
"Файл: $file";; _END_ print "Текст после лексемы _END_";

Результат работы этой программы будет следующим, если файл программы хранится в файле D:\PerlEx\examplel.exe:

Находимся в строке: 3
Файл: D:\PERLEX\EXAMPLE1.PL

      Вывода последнего в программе оператора печати не наблюдается, так как он расположен после лексемы _END_.