Perl от простого к сложному


Содержание

Иллюстрированный самоучитель по Perl

Введение в мир Perl

История языка 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, связанного с созданием многоуровневой безопасной сети, объединявшей несколько компьютеров, разнесенных на большие расстояния. Работа была выполнена, но потребовалось создание отчетов на основе большого числа файлов с многочисленными перекрестными ссылками между ними.

Perl умер? Есть ли смысл изучать Perl?

Что такое Perl? Прежде всего, Perl — это высокоуровневый интерпретируемый и динамический язык программирования.

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

Perl разработал американский программист и лингвист по образованию, Ларри Уолл.

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

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

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

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

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

Итак, умер ли Perl?

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

Если ли работа для Perl программистов?

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

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

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

Perl очень сложный язык программирования?

Не сложный, а с богатыми возможностями. По крайней мере, не сложней того же Си.

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

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

Оператор unless, которые многие не понимают, а некоторые не используют, производит логическое отрицание (!) булевой величины.

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

Готовые модули и библиотеки

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

Войдя в мир программирования, Perl безусловно, повлиял на окружающие его вещи.

ForCoder

Книги по Perl, скачать бесплатные книги, самоучители и учебники по Perl в хорошем качестве

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

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

В этом долгожданном обновлении «Верблюда» три известных автора дополнили описание языка до его текущей версии 5.14 и добавили обзор некоторых особенностей готовящейся к выходу версии 5.16. Все большую значимость в обработке текстов приобретает Юникод, а Perl предлагает лучшую и самую безболезненную поддержку этого стандарта, тесно интегрируя Юникод во все сферы, в том числе в такой популярный механизм языка Perl, как регулярные выражения.

Данное издание охватывает следующие важные особенности языка Perl: новые ключевые слова и синтаксические конструкции, уровни ввода/вывода и кодировки, новые escape-последовательности, поддержка стандарта Unicode 6.0, групповые графемы и свойства символов Юникода, именованные сохраняющие группы в регулярных выражениях, рекурсивные и грамматические шаблоны, расширенный обзор архива CPAN и современные передовые приемы программирования.

3,284 просмотров всего, сегодня нет просмотров

Программирование на Perl

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

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

В этом долгожданном обновлении «Верблюда» три известных автора дополнили описание языка до его текущей версии 5.14 и добавили обзор некоторых особенностей готовящейся к выходу версии 5.16. Все большую значимость в обработке текстов приобретает Юникод, а Perl предлагает лучшую и самую безболезненную поддержку этого стандарта, тесно интегрируя Юникод во все сферы, в том числе в такой популярный механизм языка Perl, как регулярные выражения.

Данное издание охватывает следующие важные особенности языка Perl: новые ключевые слова и синтаксические конструкции, уровни ввода/вывода и кодировки, новые escape-последовательности, поддержка стандарта Unicode 6.0, групповые графемы и свойства символов Юникода, именованные сохраняющие группы в регулярных выражениях, рекурсивные и грамматические шаблоны, расширенный обзор архива CPAN и современные передовые приемы программирования.

5,603 просмотров всего, сегодня нет просмотров

Perl-отладчик. Карманный справочник

Описание книги Perl-отладчик. Карманный справочник:
Язык Perl достаточно популярен в России. Его часто упрекают в больших неудобствах отладки приложений. Данное издание призвано исправить эгот не самый существенный недостаток языка и привлечь в ряды сторонников Ларри Уолла новых программистов. Подробно рассматривается отладчик языка Perl, использование команд, опций и переменных.

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

Содержание книги «Perl-отладчик. Карманный справочник»:

  • Что такое отладчик для Perl?
  • Зачем использовать отладчик?
  • Незнакомая территория
  • Об этой книге
  • Сценарий linecounter.pl
  • Оболочка
  • Усеченный вывод
  • Версии Perl
  • Более глубокое погружение
  • Условные обозначения
  • Благодарности и ответственность
  • Перед тем как вы приступите к отладке
  • Проверьте ваш синтаксис
  • Используйте strict
  • Предупреждения
  • Диагностика
  • Режим taint
  • Использование отладчика
  • Начало сеанса
  • Простой CGI-сеанс отладчика
  • Команды отладчика
  • Справка и выход
  • Изучение данных
  • Листинг кода и поиск
  • Продвижение
  • Действия, контрольные точки и точки наблюдения
  • Команды Perl и команды, исполняемые до и после приглашения
  • Команды оболочки и отладчика
  • Установка опций
  • Переменные отладчика
  • Переменные $DB::*
  • Переменные среды
  • Опции отладки
  • Пространства имен DB и Devel
  • Последовательность этапа выполнения
  • DB::DB()
  • DB::sub ()
  • Пространство имен Devel(-d)
  • Полезные модули
  • -DDEBUGGING
  • Справочные источники
  • Книги
  • URL
  • Онлайновые статьи
  • История
  • Графические пользовательские интерфейсы – GUI
  • Отладчики
  • Текстовые редакторы

6,773 просмотров всего, сегодня нет просмотров

Разработка Web-сайтов с помощью Perl и MySQL

Описание книги Разработка Web-сайтов с помощью Perl и MySQL:
На практических примерах описана разработка динамических Web-сайтов с помощью Perl и MySQL. Рассмотрены основные конструкции языка Perl, даны приемы написания сценариев, наиболее часто используемых в разработке Web-сайтов. Уделено внимание способам работы с базами данных посредством Perl, а также вопросам администрирования баз с помощью программы phpMyAdmin.

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

Содержание книги «Разработка Web-сайтов с помощью Perl и MySQL»:

  1. Установка программного обеспечения под Windows
  2. Основы Perl
  3. Web-программирование на Perl
  4. Основы MySQL
  5. Сплошная практика
  6. Публикация сайта

9,205 просмотров всего, сегодня нет просмотров

Automating System Administration with Perl

Описание книги Automating System Administration with Perl:
If you do systems administration work of any kind, you have to deal with the growing complexity of your environment and increasing demands on your time. Automating System Administration with Perl, Second Edition, not only offers you the right tools for your job, but also suggests the best way to approach specific problems and to securely automate recurring tasks.

Updated and expanded to cover the latest operating systems, technologies, and Perl modules, this edition of the «Otter Book» will help you:

  • Manage user accountsMonitor filesystems and processesWork with configuration files in important formats such as XML and YAML
  • Administer databases, including MySQL, MS-SQL, and Oracle with DBI
  • Work with directory services like LDAP and Active Directory
  • Script email protocols and spam controlEffectively create, handle, and analyze log files
  • Administer network name and configuration services, including NIS, DNS and DHCP
  • Maintain, monitor, and map network services, using technologies and tools such as SNMP, nmap, libpcap, GraphViz and RRDtool
  • Improve filesystem, process, and network security
  • This edition includes additional appendixes to get you up to speed on technologies such as XML/XPath, LDAP, SNMP, and SQL.

With this book in hand and Perl in your toolbox, you can do more with less — fewer resources, less effort, and far less hassle.

5,854 просмотров всего, сегодня нет просмотров

Самоучитель Perl

Описание книги Самоучитель Perl:
В книге изложены основы современного языка Perl, популярность которого постоянно возрастает, особенно в таких областях, как обработка текста, CGI — программирование, системное администрирование. Язык описан по схеме от простого к сложному: типы данных, переменные, операции, операторы и т.д. Рассматривается объектно — ориентированная технология программирования.

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

Содержание книги «Самоучитель Perl»:

  1. Введение в мир Perl
  2. Структура программы
  3. Типы данных
  4. Операции и выражения
  5. Операторы
  6. Операции ввода/вывода
  7. Работа с файлами
  8. Форматы
  9. Ссылки

9,512 просмотров всего, сегодня нет просмотров

Perl 6 и Parrot. Справочник

Описание книги Perl 6 и Parrot. Справочник:
Когда филолог Ларри Уолл создавал первую версию компьютерного языка Perl, он, наверное, не подозревал, что его детищу будет суждена долгая и увлекательная жизнь. Perl понравился администраторам и web-программистам и прочно занял свою нишу в арсенале разработчиков. У каждого языка есть свои плюсы и минусы — спорить по поводу того, какой язык лучше, можно до бесконечности.

Эта книга посвящена самой последней версии языка, который продолжает развиваться. Описываются синтаксис языка, новые возможности и идеи, рассказывается в какую сторону пойдет развитие. Книга будет полезна широкому кругу IТ-специалистов: программистам, администраторам, менеджерам.

Содержание книги «Perl 6 и Parrot. Справочник»:

  • Обзор проекта
  • Работа над проектом
  • Философия разработки
  • Базовый синтаксис
  • Подпрограммы
  • Объекты
  • Грамматики и правила
  • Внутренняя структура Parrot
  • Язык ассемблера Parrot
  • Промежуточное представление Parrot (PIR)
  • Справочник по Parrot

5,251 просмотров всего, 1 просмотров сегодня

Perl. Наглядный курс программирования

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


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

5,556 просмотров всего, сегодня нет просмотров

Perl. Сборник рецептов. Для профессионалов

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

Второе издание книги было дополнено двумя новыми главами. Одна глава посвящена mod_perl, интегрированному интерпретатору Perl веб-сервера Apache, а другая — обработке данных в формате XML. Многие старые рецепты в других главах были изменены или дополнены.

Книга рассчитана на программистов, обладающих опытом работы на Perl.

7,059 просмотров всего, сегодня нет просмотров

Разработка CGI-приложений на Perl

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

Книга поможет вам овладеть практическими приемами и методами, с которыми вы сможете разрабатывать на Perl любые Web-приложения на основе протокола CGI.

Основное внимание в книге уделяется важным вопросам разработки Web-приложений, таким как работа с базами данных, обработка форм и файлов, безопасность, электронная почта и работа с графикой.
Кроме того, в этой книге подробно рассматриваются некоторые более специальные темы: обработка Web-форм и получение через них данных пользователя, файлы cookie, отслеживание щелчков и счетчики доступа, применение модуля Apache mod_perl, связывание переменных с базами данных, встраивание кода Perl в HTML при помощи модуля HTML::Mason, управление документами через Web, создание динамических изображений, применение XML и его производных — RSS и RDF.

Книга рассчитана на программистов средней и высокой квалификации.

6,117 просмотров всего, сегодня нет просмотров

Основные вопросы о Perl

Программирование › Основные вопросы о Perl

В этой теме 0 ответов, 1 участник, последнее обновление Васильев Владимир Сергеевич 1 год назад.

Этот раздел FAQ отвечает на очень общие, высокоуровневые вопросы о Perl.

Что такое Perl?

Perl — язык программирования высокого уровня с эклектичным наследием, написанным Ларри Уоллом и тысячами других разработчиков. Он происходит от вездесущего языка C и — в меньшей степени — от sed, awk, интерпретатора команд Unix и, по крайней мере, от дюжины других инструментов и языков. Возможности Perl по работе с процессами, файлами и текстами сделали его в особенности подходящим для задач, включающих быстрое создание прототипов, разработку системных утилит и программных инструментов, управление системой, работу с базами данных, программирование графических интерфейсов, работу с сетью и программирование для веб. Эти сильные стороны сделали язык особенно популярным среди системных администраторов и авторов CGI-скриптов, но Perl также используют математики, генетики, журналисты и даже менеджеры. Вам, может, тоже следует.

Кто поддерживает Perl? Кто его разрабатывает? Почему он бесплатен?

Благодаря былой культуре Интернета, в те времена, когда он еще не был массовым явлением, а также глубоким убеждениям автора, Ларри Уолла, perl распространялся открыто и бесплатно. Perl поддерживается своими пользователями. Ядро, стандартная библиотека Perl, дополнительные модули, а также документация, которую вы сейчас читаете — всё это написано добровольцами. Дополнительные детали смотрите в персональных примечаниях в конце файла README, прилагаемого к дистрибуции исходников perl. Об особо значимых версиях Perl написано в perlhist (добавлена в 5.005).

В частности, основные разработчики (the Perl Porters) — шайка косматых альтруистов, бесплатно делающих программное обеспечение, которое лучше того, что можно купить за деньги. Подсмотреть за процессом разработки можно при помощи архивов и http://www.nntp.perl.org/group/perl.perl5.porters/, либо шлюза новостей nntp://nntp.perl.org/perl.perl5.porters (и его веб-интерфейса); или почитайте «The perl 5 porters FAQ». Можете также подписаться на список рассылки, отправив запрос (можно просто пустое сообщение) на perl5-porters-request@perl.org.

Хотя проект GNU и распространяет Perl, никакого «GNU Perl» нет: Perl не делается и не поддерживается во Free Software Foundation. Условия лицензии Perl более либеральны, чем у программного обеспечения GNU.

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

Какую версию Perl использовать?

(Отвечает Брайан Д. Фой)

Обычно это дело вкуса и убеждений, и один ответ для всех дать нельзя. В целом, вам нужно использовать либо текущую, либо предыдущую стабильную версию. Сейчас это, соответственно, perl5.10.x и perl5.8.x.

Кроме того, нужно рассмотреть многие вещи, и решить, что для вас лучше подходит.

  • Если всё уже работает, то обновление perl может что-нибудь испортить (по крайней мере, внести новые предупреждения).
  • В последних версиях perl исправлены многие ошибки.
  • Сообщество Perl направлено на поддержку самых свежих версий, поэтому проще получить совет касательно них.
  • Версии до perl5.004 содержат серьезные проблемы с безопасностью, связанные с переполнением буфера; по поводу некоторых выходили рекомендации CERT (например, http://www.cert.org/advisories/CA-1997-17.html).
  • Самые последние версии, видимо, наименее популярны и опробованы, поэтому, если не хотите рисковать, имеет смысл подождать несколько месяцев после выхода и посмотреть, с какими проблемами сталкиваются окружающие.
  • Непосредственно предшествующие версии (то есть, perl5.8.x) обычно какое-то время поддерживаются, но не так серьезно, как текущие.
  • Никто не занимается активной поддержкой Perl 4. Лет пять назад это была туша дохлого верблюда (так было написано в этом тексте), а теперь это просто скелет, и его голые кости переломаны или разъедены.
  • Выход Perl 6 не намечен, но он появится, как только будет готов. Будьте в курсе дел, но не беспокойтесь о смене основной версии Perl: никто не собирается отнимать у вас Perl 5.
  • На деле, есть два пути разработки perl: поддерживаемая и экспериментальная версия. Поддерживаемые версии стабильны, второе число в их нумерации четно (например, perl5.10.x). Экспериментальные версии могут включать возможности, которых нет в стабильной ветке; второе число в их нумерации нечетно (например, perl5.9.x).

Что такое Perl 4, Perl 5, Perl 6?

(Отвечает Брайан Д. Фой)

Вкратце: Perl 4 — это прошлое, Perl 5 — настоящее, Perl 6 — будущее.

Номер в названии после «Perl» (например, 5 в «Perl 5») — основная версия интерпретатора perl, а также языка. Каждая основная версия несет значительные изменения, которые не поддерживают прежние версии.

Нынешняя основная версия Perl — Perl 5 — вышла в 1994-м. Она может запускать скрипты предыдущей версии Perl 4 (март 1991-го), но содержит значительные изменения. В ней введено понятие ссылок, сложных структур данных и модулей. Интерпретатор Perl 5 был полностью переписан.

Perl 6 — следующая основная версия Perl, но ее синтаксис и дизайн всё еще разрабатываются. Работа начата в 2002-м и всё еще продолжается. Многие возможности из числа самых интересных показаны в последних версиях Perl 5, а некоторые модули Perl 5 позволяют использовать в программах кое-что из синтаксиса Perl 6. Дополнительную информацию о Perl 6 можно получить на http://dev.perl.org/perl6/.

История версий Perl изложена в perlhist.

Что там был за Ponie?

(Отвечает Брайан Д. Фой)

Ponie — сокращение «Perl On the New Internal Engine». Проект начал в 2003-м Артур Бергман из Fotango, потом его курировала The Perl Foundation. Он был заброшен в 2006-м.

Вместо использования имеющихся внутренних механизмов Perl, Ponie должен был создать новый для перевода с Perl 5 на Perl 6 (и осуществить другие вещи, над которыми сейчас работают в Parrot). Вы сможете просто продолжить использовать Perl 5 вместе с Parrot — виртуальной машиной, компилирующей и запускающей байткод Perl 6.

Что такое Perl 6?

Если хотите узнать больше о Perl 6 или вступить в кампанию по улучшению Perl, изучите страницу разработчиков Perl 6.

Выход Perl 6 еще не запланирован, и Perl 5 будет достаточно поддерживаться после выхода шестой версии. Не ждите Perl 6, чтобы сделать что-либо.

Как сказал Ларри Уолл, «Мы решительно настроены по отношению к переделке всего, что нужно переделать».

Насколько Perl стабилен?

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

Ларри и команда разработки Perl иногда вносят изменения во внутреннюю структуру языка, но делается всё возможное, чтобы сохранить обратную совместимость. Хотя не все скрипты Perl 4 безупречно работают в Perl 5, обновление perl практически никогда не делает программу для старой версии perl непригодной (если не считать второстепенные исправления ошибок и редкие добавления ключевых слов).

Сложно ли изучить Perl?

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

Большинство задач требует лишь небольшой части языка Perl. Один из девизов, которым руководствуется Perl — «это можно сделать несколькими способами» («there’s more than one way to do it»; TMTOWTDI, иногда произносится как «tim toady»). Так что Perl изучается легко и долго (можно много чего делать, если действительно хотите).

Наконец, так как Perl часто (не всегда и, разумеется, не по определению) — интерпретируемый язык, то вы можете писать программы без промежуточной компиляции, что позволяет быстро и просто их тестировать и отлаживать. Это еще сильнее упрощает изучение Perl.

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

Как Perl соотносится с другими языками вроде Java, Python, REXX, Scheme или Tcl?

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

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

Можно ли на Perl сделать…

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

Если имеется библиотека, предоставляющая прикладной интерфейс, любой ее компонент можно сделать функцией или переменной Perl, используя расширения Perl на C или C++, динамически связанные с основным интерпретатором perl. Можете пойти от обратного и написать основную программу на C или C++, а потом подключить на лету некоторый код Perl, чтобы создать мощное приложение. См. perlembed.

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

Когда не стоит программировать на Perl?

Если запрещает начальство; но тогда подумайте о его смене :-).

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

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

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

Какая разница между «perl» и «Perl»?

Один бит. Или вы не про ASCII? �� Ларри сейчас пишет «Perl», чтобы разделять язык и конкретную его реализацию «perl» — то есть, текущий интерпретатор. Поэтому Том шутит: «Ничто, кроме perl, не может парсить Perl».

До выхода первого издания «Programming perl» язык часто называли «perl», и это попало в заглавие, потому что оно относится к интерпретатору. В самой книге Рэндал Шварц писал называние языка с большой буквы, чтобы оно лучше выделялось в тексте. Это соглашение было принято сообществом, и второе издание уже стало «Programming Perl» — слово с заглавной буквы теперь касалось языка.

Вы можете сами решать, использовать ли это правило. Например, для единообразия лучше писать «awk и perl», «Python и Perl», а не «awk и Perl», «Python и perl». Но никогда не пишите «PERL», потому что это не сокращение (сомнительные шутки и поздние расшифровки не в счет).

Это программа на Perl или скрипт на Perl?

Вообще, Ларри всё равно. По-английски «script» — это еще и сценарий, поэтому Ларри говорит (отчасти в шутку): «Скрипт вы даете актерам, программу — публике».

Изначально скриптом называлась заранее подготовленная последовательность команд, которые обычно должны быть интерактивными — то есть, запись разговора (chat script). Нечто вроде скрипта «разговора» по UUCP или PPP, либо программы expect; также скрипты, считываемые при запуске программы, такие как .cshrc или .ircrc . Это были просто вспомогательные элементы существующих программ, не самостоятельные программы.

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

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

Илон Маск рекомендует:  Что такое код ftp_close

Что такое JAPH?

(Отвечает Брайан Д. Фой)

JAPH — аббревиатура от фразы «Just another Perl hacker», которой, начиная с конца 80-х, Рэндал Шварц подписывал сообщения электронной почты и USENET. До этого он использовал конструкцию «Just another x hacker» для многих других вещей, поэтому, дабы выделить JAPH, он стал оформлять подпись как программу на Perl:

(Запятая и пробел в конце позволяли добавлять JAxH для его других многочисленных интересов.)

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

В CPAN есть несколько программ JAPH: http://cpan.org/misc/japh.

Где можно найти сборник шуток Ларри Уолла?

(Отвечает Брайан Д. Фой)

Гуглите «Larry Wall quotes»! Можете даже попробовать кнопку «Мне повезет» ��

В Wikiquote есть шутки Ларри с указанием источников, включая сообщения в USENET и комментарии к исходникам.

Как мне убедить других использовать Perl?

(Отвечает Брайан Д. Фой)

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

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


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

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

Debug-fu в стиле Perl

Чаку Норрису не нужен отладчик, он просто пристально смотрит на код пока тот сам не сознается, где в нём баги. Если вы не Чак Норрис, то вам придётся изучить кунг-фу отладки кода, чтобы одержать победу в поединке с собственными (или чужими) ошибками.

Немного философии о программировании и ошибках

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

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

  • парадигма ООП — разложите код в маленькие чёрные ящички, чтобы я легко мог найти именно тот, в котором есть ошибки и мог его независимо подправить;
  • TDD — напишите тест, чтобы проверить, что в коде нет ошибок, до того как написан сам код.

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

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

Начало программы — самый важный участок кода

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

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

Которая будет развёрнуто объяснять вам, что означает то или иное предупреждение.

Кроме того, пользуясь случаем, хочу порекомендовать использовать CPAN-модуль strictures :

Эта прагма эквивалентна такому коду:

Т.е. теперь любые предупреждения будут трактоваться как ошибки. Кроме того, в случае, если strictures выявит, что запуск происходит в условиях разработки (запуск скрипта из каталогов t , xt , lib , blib и наличие в текущем каталоге .git или .svn ), это расширяется в конструкцию:

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

no indirect ‘fatal’ — запрещает использовать непрямые вызовы методов, например:

Почему первый вариант не стоит использовать? Посмотрите код:

Вроде всё отлично, но попробуйте передвинуть определение функции mess , после её первого использования. Это, по идее, должно быть вполне законно, но в итоге приводит к странной ошибке:

Can’t locate object method «mess» via package «message» (perhaps you forgot to load «message»?)

Ссылку на хеш Perl воспринял за класс и попробовал вызвать метод mess . Вот и получили настоящую неразбериху…

no multidimensional — спасает нас в ситуации, когда мы хотим получить срез значений хеша:

Как и ожидается, это выведет значения ключей a и b , но если мы сделали опечатку и, вместо символа @ , ввели $ , то получим пустой результат, а Perl даже не будет ругаться, так как это вполне допустимая конструкция. Прагма no multidimensional прервёт такую программу с ошибкой.

Третья прагма bareword::filehandles отучит вас от привычки засорять глобальное пространство имён, давая названия файловым дескрипторам в виде «голых» слов (bareword):

Этот код будет выдавать ошибку с данной прагмой. Разумеется, использовать стандартные STDOUT , STDERR и прочие встроенные «голые» слова не запрещается.

От простого к сложному

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

Оператор print

Самый популярный, на сегодняшний день отладчик кода — это оператор print . Расставляя его в различных местах программы, можно проверять значения переменных, видеть в каком направлении исполняется программа. Думаю, что использовать его совершенно не зазорно, т.к. это самый простой и очевидный способ поиска проблемы. Вероятно, он даже сразу подтвердит вашу догадку об ошибке без приложения больших усилий и затрат времени. Ещё лучше использовать его вместе с модулем Data::Dumper , который позволяет выводить человеко-читаемый вывод для сложных структур данных:

Плохая сторона использования print — этот кусок кода нельзя оставлять в программе. При таком способе отладки в нашем коде могут появляться десятки вызовов print , которые потом надо или удалять, или комментировать. А если ошибка снова всплывёт — снова восстанавливать. Кроме того, print , вставленный в неудачном месте, может повлиять на логику программы (например, если окажется последним оператором в коде функции).

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

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

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

Smart::Comments

Вероятно, после трудоемкого пути с комментированием/раскомментированием строк с отладочным print кому-то пришла в голову идея вставлять команды отладки через комментарии. Идея была воплощена в виде модуля Smart::Comments . В код вставляются комментарии, состоящие из трёх или более подряд идущих символов # :

Такие комментарии заставят программу вывести значения указанных выражений:

Для вывода простого текстового сообщения нужно добавить троеточие в конце комментария:

Также можно вставлять в такие текстовые сообщения метку времени и номер строки программы:

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

будут выводиться только комментарии уровня 3 и 4, но не 5 и более.

Есть также и assert , который позволяет прервать работу программы, в случае если условие не выполнено, например:

остановит программу и выведет:

Если прерывать программу не требуется, но нужно выдать предупреждение, если условие не выполнилось, можно использовать check :

С помощью умных комментариев можно даже выводить индикатор прогресса, например, для итераций циклов:

Если кому-то нравится индикатор прогресса с процентами, то это тоже возможно:

Кроме того, в случае цикла for , при продолжительном времени работы цикла, начинает выводиться также и время оставшееся до завершения цикла:

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

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

Devel::Comments

Devel::Comments — это форк Smart::Comments , который обладает некоторым новым функционалом, например, есть возможность выводить сообщения не на экран, а в файл:

Но при этом модуль имеет все те же проблемы, что и Smart::Comments .

Devel::Trace

Чтобы проследить как выполняется программа, можно использовать Devel::Trace , который отображает каждую строку исходного кода на экран перед её выполнением:

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

Carp::REPL

Модуль Carp::REPL также может использоваться при отладке:

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

Встроенный отладчик Perl

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

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

После чего мы попадаем в командную оболочку программы, которая позволяет проводить отладку приложения. Отлаживаемая программа загружается, но останавливается перед самым первым оператором (секции BEGIN и CHECK при этом выполняются). Важно, чтобы программа компилировалась без ошибок, в противном случае отладка будет невозможна. Если отладчик не может распознать команду, то он попытается выполнить её через eval как обычный Perl-код. С этой точки зрения отладчик можно рассматривать как простую REPL (Read Eval Print Loop) оболочку для Perl.

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

Команды отладчика

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

  • h [command] — без параметров выведет помощь по всем командам отладчика; если команда указана, то по ней будет выведена короткая документация; указание параметра h приведёт к подробному выводу помощи по всем командам и вывод будет достаточно длинным; для чтения длинного вывода удобно использовать пейджер, задаваемый символом вертикальной черты:
  • p expr — выведет значение выражения expr , аналогичен оператору print ;
  • x [maxdepth] expr — вычисляет значение выражения expr в списочном контексте и выводит результат, только, в отличие от print , может в читаемом виде показывать сложные вложенные структуры;
  • V [[pkg] [vars]] — отобразит все или только указанные переменные пакета (по умолчанию main ); имя переменных указывается без символа $ :

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

(или ! — для исключения):

  • X [vars] — то же самое, что и V currentpackage [vars] ;
  • y [level [vars]] — показывает все или выбранные лексические переменные;
  • T — вывод трассировки;
  • s — выполнение одного оператора программы со входом в функции;
  • n — выполнение одного оператора программы без входа в функции;
  • r — продолжить выполнение до конца текущей функции;
  • c — продолжить выполнение до следующей точки останова;
  • l — показать несколько строк исходного кода;
  • t — переключает режим трассировки;
  • b — устанавливает точку останова на указанной строке;
  • B — удаляет точку останова;
  • enable/disable — включает/выключает точку останова;
  • w expr — задаёт наблюдение за указанной переменной;
  • W expr — удаляет наблюдение за переменной;
  • q — выход из программы;
  • R — перезапуск программы;
  • m — список доступных для запуска методов/функций;
  • M — список загруженных модулей.

Опции отладчика

Опции отладчику можно задавать в переменной окружения PERLDB_OPTS , в файле

/.perldb или в опциях командной строки. Они регулируют поведение отладчика, вот некоторые из них:

  • AutoTrace — задаёт режим трассировки;
  • NonStop — отключает интерактивный режим, происходит запуск программы, пока не будет прервана сигналом или каким-то другим способом;
  • ReadLine — задаёт использование библиотеки ReadLine ; иногда требуется её отключать, если отлаживаемая программа сама использует ReadLine ;
  • LineInfo — задаёт файл для записи информации о строках кода frame — задаёт уровень информативности вывода при входе/выходе в/из процедур;
  • RemotePort — host:port для удалённой отладки; ввод и вывод перенаправляются на сетевой сокет.

Пример неинтерактивного запуска отладчика с выводом информации о вызове функций в файл listing :

Дополнительная информация

Подробную информацию об отладчике можно почитать в man -страницах perldebug и perldebtut


Другие интерфейсы к отладчику Perl

Консольный интерфейс может показаться неудобным в использовании и тяжёлым для освоения, поэтому существует несколько проектов, дающих возможность использовать более дружественные для пользователя интерфейсы.

  • Devel::ptkdb — это графический интерфейс к отладчику с использованием тулкита Tk ; он достаточно лёгкий, но рекомендовать его можно только, если вам не интересны другие альтернативы; всё-таки используемый тулкит староват и выглядит не очень привычно для современного десктопа;
  • Padre — имеет в своём составе графический интерфейс к отладчику; доступны большинство функций отладчика, выглядит вполне современно и удобно в использовании;

Devel::hdb – недавно появившийся довольно перспективный модуль, который позволяет отлаживать ваши скрипты, создавая web-интерфейс к отладчику:

Vim::Debug — модуль позволяет производить отладку внутри редактора vim.

Новое поколение отладчиков для Perl

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

Devel::ebug

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

Для Devel::ebug на данный момент есть два интерфейса: ebug — консольный клиент (в составе самого пакета) и ebug_http — веб-интерфейс (в составе Devel::ebug::HTTP ). Кроме того, в состав пакета входят клиент ebug-client и сервер ebug-server позволяющий производить удалённую отладку приложения.

Devel::Trepan

Devel::Trepan — это довольно серьёзная альтернатива стандартному отладчику Perl. Автор модуля Rocky Bernstein имеет большой опыт в области создания отладчиков, он приложил руку к созданию отладчиков для языков программирования Python, Ruby и Shell. Руководствуясь всё теми же мотивами (устаревший и тяжелый в поддержке и развитии код встроенного отладчика), создан новый отладчик, который также выдвигает новое важное требование — совместимость с набором команд gdb . Не секрет, что отладчик gdb знаком многим программистам независимо от того, на каком языке они программируют — отладка C/С++-программ и библиотек может потребоваться в любой момент. Если отладчик Perl будет иметь сходный набор команд, он будет значительно проще в освоении.

После установки доступен консольный отладчик trepan.pl . Запуск отладки происходит привычным способом:

Можно обратить внимание на использование удобной цветной подсветки синтаксиса. Кроме того, доступны некоторые полезные опции командной строки:

  • -с — подключить файл с командами отладчика (по аналогии с ключом -x gdb);
  • -x — трассировка выполняемых команд (по аналогии запуска set -x в shell);
  • —client или —server — удалённая отладка кода (клиент или сервер).

Команды trepan.pl

help — выведет подсказку по существующим командам; вывод очень похож на аналогичный вывод gdb; помощь разделена на несколько секций-классов:

  • breakpoints — остановка программ в нужном месте;
  • data — изучение данных;
  • files — изучение файлов;
  • running — управление запущенной программой;
  • stack — изучение стека;
  • status — статусная информация о программе;
  • support — утилиты отладчика;
  • syntax — синтакс команд.

Наиболее часто используемые команды:

  • step — выполнить следующий оператор (со входом в функции);
  • next — выполнить следующий оператор (без входа в функции);
  • finish — выполнить все операторы до конца данной функции;
  • continue — продолжить выполнение до точки остонова;
  • quit — выйти из программы;
  • list — показать исходный код;
  • info var (l|m|o) — показать определённый класс переменных в данной области видимости;
  • backtrace — информацию о стеке фреймов;
  • break — установка точки останова;
  • watch — отслеживание изменения переменной.

На большинство самых востребованных команд присутствует короткие псевдонимы: s — step, n — next, l — list и т.д. Весь список можно увидеть по команде alias .

Любопытно, что можно рекурсивно запускать отладку кода внутри отладчика, с помощью команды debug . Например, отладка функции Фибоначчи:

Расширения Devel::Trepan

Для отладчика Devel::Trepan уже существуют расширения, улучшающие его возможности:

  • Devel::Trepan::Shell — интерактивная командная строка Perl внутри Devel::Trepan (на основе Devel::REPL ). Интерактивная командная строка в отладчике присутствует, но всё же имеет ограничения. С данным расширением вы получаете полноценный REPL;
  • Devel::Trepan::Disassemble — поддержка команды dissassemble в отладчике. Служит для вывода дизасемблированного кода операций пакета или подпрограммы. Для вывода используется модуль B::Concise .

Заключение

Несмотря на все старания, обзор получился скорее всего не полный. Не была рассмотрена отладка XS-приложений, регулярных выражений, ничего не было сказано про профайлеры, такие как Devel::NYTProf , а также не упомянуты модули B::Concise и B::Deparse , позволяющие рассмотреть, во что транслируется Perl-код для глубокого погружения в пучины отладки. Но думаю, что этим и другим более продвинутым методам можно посвятить отдельную статью.

Записки программиста

Основы Perl — строки, числа, массивы, хэши

15 февраля 2010

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

Оглавление:

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

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

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

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

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

Привет, %username%!

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

$hash < "x" >++; # координата по x теперь равна 13
$hash < y >—; # координата по y теперь равна 52

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

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

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

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

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

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

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

Linux.yaroslavl.ru

Введение

История создания языка Perl

Слово Perl является аббревиатурой выражения Practical Extraction and Report Language (практический язык извлечений и отчетов), хотя иногда его называют Pathologically Eclectic Rubbish Lister (патологически эклектичный мусорный листер). Не стоит спорить о том, какое из этих названий более правильное , потому что оба они принадлежат Ларри Уоллу, создателю и главному архитектору, распространителю и опекуну языка Perl. Ларри создал этот язык, когда пытался формировать отчеты из иерархии файлов системы оповещения об ошибках, похожей на Usenet-новости, а возможности применявшегося в то время обработчика потоков данных awk оказались исчерпанными. Будучи настоящим (то есть ленивым) программистом, Ларри решил вырвать данную проблему с корнем, применив для этого какой-нибудь универсальный инструмент, который он надеялся использовать и в дальнейшем. В результате появилась первая версия языка Perl.

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

В результате Perl все рос и рос, причем почти с той же скоростью, что и операционная система UNIX. (Специально для новичков: все ядро UNIX тогда требовало памяти объемом 32 К! Теперь мы счастливы, если нам удается уместить его в несколько мегабайтов.) Выросли и его возможности.

Повысилась переносимость. То, что когда-то было компактным языком, теперь сопровождается сотнями страниц документации, в состав которой входят десятки man-страниц, 600-страничный справочник серии Nutshell, материалы множества телеконференций Usenet с 200000 подписчиков, — а теперь еще и эта скромная книга.

Ларри уже не сопровождает Perl в одиночку, но сохраняет свой эксклюзивный титул главного архитектора. A Perl все растет и растет.

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


Назначение языка Perl

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

Научившись пользоваться языком Perl, вы, возможно, обнаружите, что начинаете тратить меньше времени на правильное заключение в кавычки различных параметров shell (или на корректное выполнение С-объявлений), а больше — на чтение Usenet-новостей и катание с гор на лыжах, потому что Perl — замечательное средство для вашего совершенствования как программиста. Мощные конструкции этого языка позволяют создавать (с минимальной затратой сил) некоторые очень эффективные специализированные решения и универсальные инструменты. Эти инструменты можно использовать и в дальнейшем, потому что написанные на Perl программы отличаются высокой переносимостью и готовностью к использованию. В результате у вас появится еще больше времени для чтения Usenet-новостей и посещения с друзьями баров караоке.

Как и любой язык, Perl может быть языком » только_для _ написания » программ, которые потом будет невозможно прочитать. Однако при правильном подходе вы можете избежать этого весьма распространенного недостатка. Да, иногда Perl-текст выглядит для непосвященных как случайный набор символов, но умудренный опытом Perl-программист знает, что у этого набора есть контрольная сумма и каждый его символ имеет свое предназначение. Если вы будете следовать указаниям, приведенным в нашей книге, ваши программы будут легкими для чтения и простыми для сопровождения — но, вероятно, не выиграют никаких » состязаний по заумности».

Если при попытке вызвать Perl из sneil вы получите сообщение perl: not found

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

Perl распространяется по открытой лицензии GNU (GNU Public License)*, согласно которой «вы можете распространять двоичные файлы языка Perl только в том случае, если предоставляете исходный код бесплатно, а если вы модифицируете их, вы должны распространять и код этих изменений». По сути дела это означает, что Perl распространяется бесплатно. Его исходный текст можно получить по цене пустой ленты или оплатив стоимость передачи нескольких мегабайтов информации по телефонной линии. При этом никто не может » придержать» сам Perl и послать вам просто двоичные файлы, соответствующие чьему-либо конкретному представлению о «поддерживаемых аппаратных платформах».

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

Программисты настолько увлеклись языком Perl, что, помимо UNIX- и UNIX-подобных систем, начали использовать его и в системах Amiga, Atari ST, системах семейства Macintosh, VMS, OS/2, даже MS-DOS и, наконец, в Windows NT и Windows 95. К тому моменту, когда вы будете читать эти строки, Perl, вероятно, перенесут и на многие другие системы. Исходные тексты языка Perl (и многие предкомпилированные двоичные файлы для He-UNIX-архитектур) можно получить на одном из серверов сети CPAN (Comprehensive Perl Archive Network). Если вы имеете доступ к World Wide Web, посетите сервер hftp://www.perl.com/CPAN, являющийся одним из множества «зеркальных» (дублирующих) серверов. Если вы абсолютный новичок, отправьте по адресу bookquestions@ora.com послание с вопросом » Где можно получить Perl. » ^Where 1 сап set Perl. «).

Илон Маск рекомендует:  Что такое код zip_close

Или по несколько более либеральной «художественной лицензии» (Artistic License), согласно которой Perl распространяется в виде дистрибутива.

Сценарий shell — это не что иное, как последовательность команд shell, оформленная в виде текстового файла. Этот файл затем превращается в исполняемый путем включения бита исполнения (посредством команды chmod + х имя_файла), после чего по приглашению shell вводится имя файла. Давайте рассмотрим какой-нибудь сценарий shell. Например, сценарий выполнения команды date, а затем команды who можно записать и выполнить так:

% echo date >somescript % echo who ”somescript % cat somescript date

% chmod +x somescript % somescript

[результат выполнения команды date, затем команды who] %

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

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

Если же ваш Perl инсталлирован в каком-то нестандартном каталоге или если ваша система » не понимает» строку, начинающуюся с символов #!, придется сделать кое-что еще. Узнайте об этом у того, кто инсталлировал вам Perl. В примерах, приведенных в книге, предполагается, что вы пользуетесь именно этим , общепринятым механизмом обозначения Perl-программ.

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

* Это справедливо для UNIX-систем. Указания о том, как сделать сценарий исполняемым в других системах, вы можете найти в сборнике ответов на часто задаваемые вопросы (FAQ) пп Perl или в документации, приложенной к вашей операционной системе.

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

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

Аналогично сценарию shell, Pe rl-программа состоит из всех операторов Perl, имеющихся в файле и рассматриваемых в совокупности как одна большая программа, подлежащая выполнению. Понятия «основной» (main) программы, как в С, здесь нет.

Комментарии в Perl похожи на комментарии shell (современные). Комментарием является все, что следует за незаключенным в кавычки знаком # вплоть до конца строки. Многострочных комментариев, как в С, здесь нет.

В отличие от большинства shell (но аналогично awk и sed), интерпретатор языка Perl перед выполнением программы полностью разбирает ее и компилирует в свой внутренний формат. Это значит, что после запуска программы вы никогда не получите сообщение о синтаксической ошибке и что пробельные символы и комментарии не замедляют ход выполнения программы. Такой метод обеспечивает быстрое выполнение операций языка Perl после запуска и является дополнительным стимулом к отказу от использования С в качестве служебного языка систем лишь на том основании, что С — транслируемый язык.

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

Perl, таким образом, работает и как компилятор, и как интерпретатор. С одной стороны, это компилятор, потому что перед выполнением первого оператора программы она полностью считывается и разбирается. С другой стороны . Perl — интерпретатор, потому что никакого объектного кода, занимающего место на диске в ожидании исполнения, в данном случае нет. Другими словами, он сочетает в себе лучшее из компилятора и интерпретатора. Конечно же, было бы просто здорово, если бы выполнялось какое-то кэширование компилированного объектного кода между вызовами, а то и его трансляция в » родной» машинный код. Рабочая версия такого компилятора фактически уже существует, и сейчас планируется, что она войдет в выпуск 5.005. О текущем состоянии дел можно узнать в сборнике FAQ, посвященном Perl.

Прогулка по стране Perl

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

Программа Hello, World

Давайте рассмотрим небольшую программу, которая делает что-то реальное. Вот ваша базовая программа, которая выводит на экран слова «Hello, World»:

^! /usr/bin/perl -w print («Hello, World\n») ;

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

Вторая строка — это выполняемая часть данной программы. Здесь мы видим функцию print. В данном случае встроенная функция print имеет всего один аргумент, С-подобную текстовую строку. В этой строке комбинация символов \п обозначает символ новой строки. Оператор print завершается точкой с запятой (;). Как и в С, все простые операторы в Perl завершаются точкой с запятой*.

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

* Точку с запятой можно опустить, если оператор является последним оператором в блоке или файле либо оператором eval.

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

Как задавать вопросы и запоминать результат

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

Одно из мест для хранения значений (вроде имени) — скалярная переменная. Для хранения вашего имени в нашей программе мы используем скалярную переменную $name. В главе 2, «Скалярные данные», мы более подробно узнаем о том, что можно хранить в этих переменных и что можно с ними делать. Пока же предположим, что мы можем хранить в скалярной переменной только одно число или строку (последовательность символов).

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

print «What is your name? «; # Как ваше имя? $name = ;

Значение переменной $name пока содержит завершающий символ новой строки (имя Randai поступает как Randal\n). Чтобы избавиться от этого символа, мы воспользуемся функцией chomp, которая в качестве своего единственного аргумента принимает скалярную переменную и удаляет из ее строкового значения завершающий символ перехода на новую строку (пробельный символ), если он присутствует:

Теперь нам нужно лишь сказать Hello и указать значение переменной $name, что мы можем сделать так, как в shell, поместив эту переменную в заключенную в кавычки строку:

orint «Hello, $name ! \n»;

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

Сложив все вместе, получаем:

•ft! /usr/bin/perl -w print «What is your name? » ; $name = ; chomp ($name) ; print «Hello, Sname ‘ \n» ;

Добавляем возможность выбора

Допустим теперь , что у нас припасено какое-то особое приветствие для пользователя по имени Рэндал, а для остальных — обычное. Для этого нам нужно сравнить имя, которое было введено, со строкой Randal, и, если оно совпадает, сделать что-то особое. Давайте добавим в программу С-подобную ветвь tf-then-eise и операцию сравнения:

print «What is your name? «; $name = ; chomp ($name> ; if ($name eq «Randal») <

print «Hello, Randal! How good of you to be here!\n»; > else < print "Hello, $name! \n"; # обычное приветствие

В операции eq сравниваются две строки. Если они равны (т.е. совпадают все символы и длина строк одинакова), результатом будет «истина». (В С и C++ подобной операции нет *).

Оператор if выбирает, какой блок операторов (заключенных между парными фигурными скобками) выполняется; если выражение дает в результате значение «истина», выполняется первый блок, в противном случае выполняется второй блок.

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

$secretword = «llama»; # секретное слово print «What is your name? «; $name = ; chomp $name;

* Для получения аналогичного результата можно использовать стандартную подпрограмму libc. Но это не операция.

print «Hello, $name ‘ \n»; # обычное приветствие print «What is the secret word? «; $guess = ; chomp ($guess) ; while ($guess ne $secretword) <

print «Wrong, try again. What is the secret worcl.•’ ‘• ; $guess = ; chomp ($guess) ;

Сначала мы задаем секретное слово, помещая его в скалярную переменную $secretword. После приветствия программа спрашивает (посредством вызова еще одной функции print) у пользователя (не Рэндала) его вариант секретного слова. Этот вариант сравнивается с заданным секретным словом в операции ne. Данная операция возвращает значение » истина», если сравниваемые строки не равны (т.е. данная операция противоположна операции eq). Результат сравнения управляет циклом while, который выполняет этот блок операторов до тех пор, пока сравнение дает значение » истина».

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

Несколько секретных слов

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

Более эффективное решение — хранить все возможные ответы в структуре данных, которая называется список , или (предпочтительнее) массив. Каждый элемент массива — это отдельная скалярная переменная, которой можно присваивать значение и затем использовать ее независимо от других. Можно также одним махом присвоить значение всему массиву. Мы имеем право присвоить значение всему массиву с именем @words так, чтобы он содержал три возможных правильных пароля:

@words = («camel», «llarna», «alpaca»);

Имена переменных-массивов начинаются с символа @ , что позволяет отличать их от имен скалярных переменных. Существует еще один способ записи этой конструкции так, чтобы не нужно было ставить все эти кавычки — с помощью операции qw ( ) , например:

@words = qw (camel llama alpaca) ;

Это абсолютно то же самое; операция qw работает так, как будто мы взяли в кавычки каждую из трех строк.

Присвоив значения элементам массива, мы можем обращаться к каждому из них по индексной ссылке. Так, $words [0] — это camel, $words [1] — llama, a $words [2] — alpaca. Индекс может быть и выражением, поэтому если мы присвоим $i значение 2, то элементом $words [$i] будет alpaca. (Индексные ссылки начинаются с символа $, а нес @ , потому что они обозначают один элемент массива, а не весь массив.) Вернемся к нашему предыдущему примеру:

#! /usr/bin/perl -w @words == qw (camel llama alpaca); print «What is your name? » ; $name = ; chomp ($name) ; if ($name eq «Randal») <

print «Hello, Randal! How good of you to be here!\n»; > else <

print «Hello, $name ! \n»; # обычное приветствие print «What is the secret word? «; $guess = ; chomp ($guess) ;

$i = 0; # сначала попробуем это слово $correct = «maybe»; # догадка верна или нет? while ($correct eq «maybe») < # продолжаем проверку

if ($words [$i] eq $guess) < # верно?

$i = 0; # вновь начать проверку с первого слова >

> # конец цикла while для неверных слов > # конец цикла «не Рэндал»

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

В этой программе показан также блок eisif оператора if-then-eise. Такой конструкции нет ни в одном другом языке программирования; это сокращенная запись блока else с новым условием if, но без вложения еще одной пары фигурных скобок. Сравнение набора условий в каскадной цепочке if-eisif-eisif-eisif-eise очень характерно для языка Perl. В нем нет эквивалента оператору switch языка С или оператору case языка Паскаль, но вы можете сами без особых хлопот создать такой оператор. Подробности см. в главе 2 книги Programming Perl и на странице руководства perlsyn( 1 ).

Разные секретные слова для разных пользователей

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

Пользователь

Секретное слово

Fred Barney Betty Wilma

camel llama alpaca alpaca

Обратите внимание: у последних двух пользователей одинаковые секретные слова. Такое допускается.

Самый простой способ сохранить такую таблицу — использовать хеш . В каждом элементе хеша содержится отдельное скалярное значение (как и в массиве любого другого типа), но в соответствие каждому элементу хеша ставится ключ . Ключом может быть любое скалярное значение (любая строка или число, в том числе нецелые и отрицательные числа). Чтобы создать хеш под именем Swords (обратите внимание на то, что используется символ ^ вместо @ ) с ключами и значениями, данными в приведенной выше таблице, мы присвоим Swords значение (почти так же, как мы делали раньше с массивом):

Swords = qw( fred camel barney llama betty alpaca wilma alpaca

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


Чтобы найти секретное слово для Betty, мы должны использовать имя Betty как ключ в ссылке на хеш Swords с помощью выражения вроде $words < "betty">. Значение этой ссылки — alpaca, это похоже на то, что мы видели раньше, работая с другим массивом. Как и раньше, ключом может быть любое выражение, поэтому установка $person в значение betty и вычисление $words < $ p erson>также дает в результате alpaca.

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

#! /usr/bin/perl -w % words = qw ( fred camel barney llama betty alpaca wilma alpaca

print «What is your name? «; $name = ;

chomp ( $name) ; if ($name eq «Randa l «) <

print «Hello, Randal! How good of you to be here!\n»; > else <

print «Hello, $name !\n»; # обычное приветствие $secretword = $words <$name>; # получить секретное слово print «What is the secret word? «; $guess = ; chomp ($guess) ; while ($guess ne $secretword) <

print «Wrong, try again. What is the secret word? «; $guess = ; chomp ($guess) ;

Обратите внимание на то , как происходит поиск секретного слова. Если имя не найдено , то значением переменной $secretword будет пустая строка *, и мы можем использовать оператор if, чтобы задать секретное слово по умолчанию для кого-нибудь еще. Вот как это выглядит:

[ . .. остальная часть программы удалена . . . ] $secretword = $words ($name>; # получить секретное слово

$secretword = «groucho»; # конечно,

print «What is the secret word? «; [. .. остальная часть программы удалена .. . ]

Обработка различных вариантов ввода секретного елова

Если вместо Randai вы введете Randai L. Schwartz или randa l , то тем самым лишите Рэндала права на особое приветствие , потому что сравнение eq предполагает точное равенство. Давайте рассмотрим один способ решения задачи обработки различных вариантов ввода.

* На самом деле это значение undef, но для операции eq оно выглядит как пустая строка. Если бы в командной строке вы использовали ключ -w, то получили бы предупреждение на этот счет. Именно поэтому мы его здесь опустили.

Допустим, вы хотите найти все строки, которые начинаются со слова Randal, а не просто строку, равную Randal. В sed, awk или grep это можно сделать с помощью регулярного выражения — шаблона, определяющего совокупность соответствующих строк. Как и в sed, awk или grep, в Perl регулярным выражением, которое соответствует любой строке, начинающейся со слова Randal, будет ^Randai. Чтобы сравнить его со строкой, содержащейся в скалярной переменной $ name, мы используем операцию сопоставления:

+f да, совпадает ) else ( ## нет, не совпадает

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

Это почти решает нашу задачу, но не позволяет выбрать randal или отклонить Randall. Чтобы принять randal, мы добавляем опцию игнорирования регистра — прописную букву i после закрывающей косой. Чтобы отклонить Randall, мы вводим в регулярное выражение специальный маркер границы слова (подобно тому как это делается в vi и в некоторых версиях grep) в форме \b. Это гарантирует, что символ, следующий в регулярном выражении за первой буквой 1, не является еще одной буквой. В результате наше регулярное выражение принимает вид /^randal\b/i, что означает «слово randal, стоящее в начале строки, за которым нет ни буквы, ни цифры, при этом регистр не имеет значения». Объединив этот фрагмент с остальной частью программы, получим:

#! /usr/bin/perl %words = qw ( fred camel barney llama betty alpaca wilma alpaca );

print «What is your name? «; $name = ; chomp ($name); if ($name =

print «Hello, Randal! How good of you to be here!\n»; > else <

print «Hello, $name! \n»; # обычное приветствие $secretword = $words <$name>; # получить секретное слово if ($secretword eq «») < # не найдено

$secretword = «groucho»; t конечно, можно использовать >

print «What is the secret word? «; $guess = ;

chomp ($guess , while ($guess ne Ssecretword) (

print «Wrong, try again. What is the secret word? «; $guess = ; chomp ($guess) ;

Как видите, эта программа уже довольно далека от простенькой Hello, World. Хотя она и очень мала, но вполне работоспособна, причем краткость программы достигается весьма небольшими усилиями. В этом — стиль Perl.

В Perl имеется все, что необходимо для работы с регулярными выражениями, т.е. он предоставляет все возможности, которые обеспечивает любая стандартная утилита UNIX (и даже некоторые нестандартные). Способ сопоставления строк, используемый в Perl, является, чуть ли не самым быстрым сравнительно с другими языками, поэтому производительность системы при выполнении Perl-программ никоим образом не снижается. (Написанная на Perl grep-подобная программа часто превосходит прилагаемую поставщиками программу grep на С*. Это значит, что grep не выполняет толком даже единственную свою задачу.)

Справедливость для всех

Итак, теперь я могу ввести Randal, randal или Randal L. Schwartz, но как быть с остальными? Барни должен вводить в точности barney (ему нельзя ввести даже пробел после barney).

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

Сначала — операция подстановки: мы хотим взять содержимое переменной $ name, найти первый специальный (не использующийся в словах) символ и убрать все символы, начиная с того места, где он стоит, и до конца строки. Искомое регулярное выражение имеет вид /\w.*/. Здесь \w обозначает специальный символ (т.е. все кроме буквы, цифры и знака подчеркивания), а . * обозначают любые символы с этого места до конца строки. Чтобы убрать эти символы, нужно взять ту часть строки, которая совпадает с рассматриваемым регулярным выражением, и заменить ее пустой строкой:

Мы используем ту же операцию =

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

Однако GNU-версия утилиты egrep выполняет эту операцию гораздо быстрее, чем Perl.

примере — это пустая строка между второй и третьей косыми.) Эта операция выглядит и выполняется во многом так же, как операции подстановки в программах-редакторах.

Теперь для того, чтобы перевести все оставшиеся символы в нижний регистр, мы преобразуем эту строку с помощью операции tr*. Она очень похожа на UNIX-команду tr, т.е. получает список искомых символов и список символов, которыми искомые символы заменяются. В нашем примере мы, чтобы перевести содержимое переменной $name в нижний регистр, используем такую запись:

Между косыми заключены списки искомых и заменяющих их символов. Дефис между буквами а и z обозначает все символы, находящиеся между ними, т.е. у нас есть два списка, в каждый из которых включено по 26 символов. Когда tr находит символ из какой-либо строки первого списка, он заменяется соответствующим символом из второго списка. В результате все прописные буквы А, В, С и т.д. становятся строчными **. Объединяя эти строки с остальной частью программы, получаем :’

#!/usr/bin/perl Swords » qw ( fred camel bamey llama betty alpaca wilma alpaca

print «What is your name? «; $name = ; chomp ($name);

$original name = $name; # сохранить для приветствия $name =

s/\W.*//; # избавиться от всех символов, следующих после первого слова

tr/A-Z/a-z/; # перевести все в нижний регистр if ($name eq «randal») ( * теперь можно так сравнить

print «Hello, Randal! How good of you to be here!\n»; else (

print «Hello, $original_name! \n»; ^ обычное приветствие $secretword = $words($namel; # получить секретное слово if ($secretword eq «») ( # не найдено

$secretword == «groucho»; 4 конечно, можно использовать >

print «What is the secret word? «; $guess = ; chomp ($guess); while ($guess ne $secretword) (

* Символы с диакритическими знаками такому переводу не поддаются. Подробности см. на man-странице рег11оса 1 е( \) в версии языка Pel-15.004.

** Специалисты заметят ,что мы также могли написать нечто вродез /(\3*) .*/\L$1/, чтобы сделать все это за один присест, но специалисты, вероятно, не будут читать данный раздел.

print «Wrong, try again. What is the secret word? «; $guess = ; chomp ($guess);

Обратите внимание на то, что сопоставление с регулярным выражением для слова Randai вновь выполняется с помощью обычной операции сравнения. Дело втом, что и RandaL L. Schwartz, и Randai после подстановки и перевода превращаются в randai. Для всех остальных пользователей справедливо то же самое, потому что Fred и Fred Flinstone превращаются во fred; Barney Rubbie И Barney, the little guy — В barney И Т.Д.

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

Отметим, однако, что в процессе обработки имени (т.е. при его модификации, необходимой для проведения операции сравнения и поиска соответствия в таблице) первоначально введенное имя уничтожается. Поэтому перед обработкой имени программа сохраняет его в переменной $original name. (Как и имена в С, имена переменных в Perl состоят из букв, цифр и знаков подчеркивания, причем длина их практически не ограничена.) Благодаря этому мы впоследствии сможет ссылаться на $ original name.

В Perl имеется много способов, позволяющих проводить анализ и изменение символов в строках. С большинством из них вы познакомитесь в главах 7 и 15.

Повышение степени модульности

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

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

Давайте создадим для нашей маленькой, но быстро растущей программы подпрограмму good_word, которая будет принимать имя и вариант слова и возвращать значение «истина», если это слово введено правильно, и » ложь», если слово набрано неправильно. Определение такой подпрограммы выглядит следующим образом:

sub good _ word (

my($somename,$someguess) = @_; # назвать параметры $somename =

s/\W.*//; # избавиться от всех символов, стоящих после

tr/A-2/a-z/; t перевести все символы в нижний регистр if ($somename eq «randal») ( # не нужно угадывать

return 1; # возвращаемое значение — true I elsif (($words($somename> 11 «groucho») eq $someguess) (

return 1; # возвращаемое значение — true ) else < return 0; * возвращаемое значение — false

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

Первая строка в данном конкретном определении — это операция присваивания, с помощью которой значения двух параметров подпрограммы копируются в две локальные переменные с именами $somename и $someguess (директива ту ( ) определяет эти переменные как локальные для блока, в который они входят (в данном случае для всей подпрограммы), а параметры первоначально находятся в специальном локальном массиве с именем @ .)

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

Оператор if-elsif-else позволяет определить, является ли введенный пользователем вариант слова ($someguess) верным для имени ($somename). Имя Randal не должно попасть в эту подпрограмму, но даже если и попадет, то любой вариант его ввода будет принят как правильный.

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

Проверка в части eisif выглядит довольно сложной; давайте разобьем ее на фрагменты:

($words($somename) И «groucho») eq $someguess

Первый элемент в круглых скобках обеспечивает проведение уже знакомого нам хеш-поиска, в результате которого отыскивается некоторое значение в массиве %words на основании ключа, полученного из массива $somename. Знак 1 1, стоящий между этим значением и строкой groucho, обозначает операцию ИЛИ, аналогичную той, что используется в языке С, awk и в различных shell. Если поиск в хеше даст некоторое значение (это

значит, что ключ $ some name находился в хеше), то оно и будет являться значением данного выражения. Если ключ найден не был, то используется строка groucho. Это весьма характерно для Perl: приводится некоторое выражение, а затем с помощью операции 1 1 для него указывается значение по умолчанию на тот случай, если результатом поиска является значение «ложь».

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

Выразим все это в виде правила: если имя — randal или если вводимый пользователем вариант соответствует одному из имен, находящемуся в массиве %words (со значением по умолчанию groucho, если имя в массиве не найдено), то подпрограмма возвращает 1; иначе подпрограмма возвращает 0. Теперь давайте свяжем все новые строки с остальной частью программы:

#! /usr/bin/perl Swords = qw( fred camel barney llama betty alpaca wilma alpaca ) ;

print «What is your name? «; $name = ; chomp ($name) ; if ($name «

/^randal\b/i) ( t обратно на другой путь :-)

print «Hello, Randal! How good of you to be here!\n»; I elscj/ <

print «Hello, $name! \n»; t обычное приветствие print «What is the secret word? «; $guess = ; chomp ($guess);

while (! good word( $name, $guess)) ( print «Wrong, try again. What is the secret word? «; ?guess “ ; chomp ($guess) ;

t. здесь вставляется определение подпрограммы good_word() . ]

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

Наибольшее отличие этой программы от предыдущей состоит в том, что здесь используется цикл while, содержащий подпрограмму &good_word. При вызове этой подпрограммы ей передаются два параметра, $name и $auess. Значение $somename устанавливается равным первому параметру,

в данном случае $name. Аналогичным образом $someguess передается во втором параметре, $guess.

Значение, возвращаемое этой подпрограммой (1 или 0, если вы помните приведенное выше правило), логически инвертируется префиксной операцией ! (логическое НЕ). Эта операция возвращает значение «истина», если следующее за ней выражение ложно, или «ложь», если оно истинно. Результат этой операции управляет циклом while. Можете читать такую запись как «до тех пор, пока слово угадано неправильно . «. Многие хорошо написанные Perl-программы очень похожи на обычный английский язык — если, конечно, не позволять себе много вольностей ни с языком Perl, ни с английским. (Но Пулитцеровскую премию даже за очень хорошую программу вам не дадут.)

Обратите внимание: при разработке этой подпрограммы предполагалось, » то значение хеша %words задается в основной программе.


Столь деликатный подход к использованию глобальных переменных вызван тем, что обращаться с ними нужно очень аккуратно. Говоря в общем, переменные, не созданные с помощью ту, глобальны для всей программы, тогда как переменные ту действуют только до завершения выполнения блока, в которым они были объявлены. Но не беспокойтесь: в языке Perl имеется множество других разновидностей переменных, включая переменные, локальные для файла (или пакета), и переменные, локальные для функции, которые сохраняют свои значения от вызова к вызову — а это как раз то, что мы могли бы здесь использовать. Впрочем, на данном этапе вашего знакомства с Perl изучение этих переменных только осложнило бы вам жизнь. Когда вы будете достаточно готовы к этому, посмотрите, что говорится о контекстах, подпрограммах, модулях и объектах в книге Programming Perl, или обратитесь к диалоговой документации, имеющейся на man-страницах perlsub(\), perlmod(l), perlobJ(l) и perltoot(l).

Перенос списка секретных слов в отдельный файл

Допустим, вы хотели бы использовать список секретных слов в трех программах. Если вы сохраните этот список так, как мы уже это делали, нам придется корректировать все три программы (если, например, Бетти решит, что ее секретным словом должно быть не alpaca, a swine). Это может стать настоящим кошмаром, особенно если Бетти отличается непостоянством.

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

Это делается с помощью следующего кода:

open (‘..’ORDSLIST, «wordslist»); while ($name =

chomp ($name); $word = ; chomp ($word); $words ($name> = Sword;

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

Илон Маск рекомендует:  Объекты JavaScript

Произвольно выбранный формат списка слов — один элемент в строке с чередованием имен и секретных слов. Для нашей базы данных мы имели бы такой список:

fred camel barney llama betty alpaca wilma alpaca

Функция open инициализирует дескриптор файла wordslist, связывая его с файлом wordslist, находящимся в текущем каталоге. Отметим, что перед этим дескриптором не ставится никакого забавного символа, вроде тех трех, что предваряют наши переменные. Кроме того, дескрипторы файлов обычно записываются прописными буквами (хотя это и не обязательно); причины этого мы рассмотрим позднее.

При выполнении цикла while читаются строки из файла wordslist (через дескриптор файла wordslist) по одной при каждом проходе цикла. Каждая строка заносится в переменную $name. По достижении конца файла операция возвращает пустую строку *, которая для цикла while означает «ложь», и завершает цикл.

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

while ( defined ($name =

* На самом деле это опять undef, но для понимания данного материала сказанного достаточно.

Но если бы вы были еще более осторожны, вы, вероятно, проверили бы также и то, возвращает ли функция open значение «истина». Это, кстати, в любом случае неплохая идея. Для выхода из программы с сообщением об ошибке в случае, если что-то работает не так, часто используется встроенная функция die. Мы рассмотрим пример этой функции в следующей версии нашей программы.

С другой стороны, при нормальном развитии событий мы считываем строку (включая символ новой строки) в переменную $ name. Сначала с помощью функции chomp убирается символ новой строки, затем нужно прочитать следующую строку, чтобы получить секретное слово и сохранить sro в переменной $word. Символ новой строки при этом тоже убирается.

Последняя строка цикла while помещает $word в %words с ключом $name, чтобы переменную $word могла использовать остальная часть программы.

По завершении чтения файла его дескриптор можно использовать повторно, предварительно закрыв файл с помощью функции close. (Дескрипторы файлов автоматически закрываются в любом случае при выходе из программы, но мы стараемся быть аккуратными. Однако если бы мы были по-настоящему аккуратными, мы бы даже проверили бы, возвращает ли ^lose значение » истина» в случае, если раздел диска, в котором был файл, решил «отдохнуть», если сетевая файловая система стала недосягаемой или произошла еще какая-нибудь катастрофа. Такое ведь иногда случается. Законы Мерфи никто не отменял.)

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

fr! /usr/bin/perl init words () ;

print «What is your name? «; $name = ; ;homp $name; if ($name =

/^randal\b/i) ( * обратно на другой путь :-)

print «Hello, Randal! How good of you to be here!\n»; I else (

print «Hello, $name! \n»; # обычное приветствие •print «What is the secret word? «; $guess = ; ^homp ($guess) ;

^hile (! good word($name, $guess)) I print «Wrong, try again. What is the secret word? «; $guess = ; :homp ($guess);

s ub init_words ( open (WORDSLIST, «wordslist») 11

die «can’ tl open woraJ.isT:: ^’ .ihile ( defined ($name = = ; chomp $word; $words( $name) = $word; I close (WORDSLIST) II die «couldn’t close wordlist: $»‘

my($somename,$someguess) = @_; * перечислить параметры $somename =

s/\W.*//; # удалить все символы, стоящие после первого слова # первое слово

tr/A-Z/a-z/; # перевести все символы в нижний регистр :.f ($somename eq «randal») ) не нужно угадывать

return 1; * возвращаемое значение — true elsif (($words($somename) II «groucho») eq $someguess) (

return 1; * возвращаемое значение — true else ( •eturn 0; i возвращаемое значение — false

Теперь написанный нами код начинает выглядеть как настоящая «взрослая» программа. Обратите внимание: первая выполняемая строка — вызов подпрограммы init_word() . Возвращаемое значение в последующих вычислениях не используется, и это хорошо, потому что мы не возвратили ничего заслуживающего внимания. В данном случае это гарантированно значение «истина» (в частности, значение 1), потому что если бы close не выполнилась, то die вывела бы сообщение в stderr и вышла из программы. Функция die подробно описывается в главе 10, но поскольку очень важно проверять возвращаемые значения всего, что может завершиться неудачно, мы возьмем за правило использовать эту функцию с самого начала. Переменная $! (тоже рассматривается в главе 10) содержит системное сообщение об ошибке, поясняющее, почему данный системный вызов завершился неудачно.

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

Как обеспечить скромный уровень безопасности

‘ Этот список секретных слов должен меняться минимум раз в неделю !», — требует Главный Директор Списков Секретных Слов. Мы не можем, конечно, заставить пользователей еженедельно менять пароли, но должны хотя бы предупреждать их о том, что список секретных слов не изменялся в течение семи дней и более.

лучше всего делать это в подпрограмме init_words ( ) ; мы уже раоотаем в ней с файлом wordlist. Perl-операция -м возвращает значение, равное количеству дней, прошедшему с момента изменения файла или дескриптора файла, поэтому нам нужно просто посмотреть, превышает ли это значение число семь для дескриптора файла wordslist:

open (HORDSLIST, «wordslist») 11 die «can’t open wordlist: $!»;

if (- М WORDSLIST >= 7.0) ( f в соответствии с бюрократическими правилами

die «Sorry, the wordslist is older than seven days. «; I while ($name =

chomp ($name) ; $word = ; chomp ($word) ; $words($name> = $word;

close (WORDSLIST) 11 die «couldn’t close wordlist: $!»;

Значение -м wordslist сравнивается со значением 7. Если оно больше, то мы, выходит, нарушили правила. Здесь мы видим новую операцию, операцию die, которая одним махом выводит сообщение на экран* и прерывает программу.

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

Помимо определения «возраста» файла мы можем узнать имя его владельца, размер, время последнего доступа к нему и все остальные сведения, хранимые системой о каждом файле. Более подробно об этом написано в главе 10.

Как предупредить пользователя, если он сбился с пути

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

Почтовое сообщение будет послано вам в том случае, если вы вставите свой адрес электронной почты там, где в программе записано YOUR_AD-DRESS_HERE. Все, что нам нужно для этого сделать, это непосредственно перед тем, как возвращать из подпрограммы 0, создать дескриптор файла, который фактически будет являться процессом (mail):

my($sornename,$someguess) = @ ; # перечислить параметры •^somename =

s/\W.*//; t удалить все символы, стоящие после

И первого слова

* Если точнее, то в дескриптор файла stderr, но обычно это и означает терминал.

tr/A-Z/a-z/; # перевести все символы в нижний регистр if ($somename eq «randal») ( # не нужно угадывать return 1; # возвращаемое значение — true

open MAIL, «Imail YOUR_ADDRESS_HERE»; print MAIL «bad news: $somename guessed $someguess\n»; close MAIL; return 0; 4f возвоашаемое значение — false

первый новый оператор здесь — open, в начале второго аргумента которого стоит оператор канала (1). Он указывает, что мы открываем процесс, а не файл. Поскольку оператор канала находится перед именем команды, мы открываем процесс так, чтобы можно было осуществить в него запись. (Если поставить оператор канала в конец, а не в начало, то можно будет читать выходную информацию команды.)

Следующий оператор, print, выбирает для вывода не stdout*, а дескриптор файла, стоящий между ключевым словом print и подлежащими выводу на экран значениями. Это значит, что сообщение в конечном итоге станет входной информацией для команды mail.

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

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

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

Несколько файлов секретных слов в текущем каталоге

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

» Говоря техническим языком — выбранный в текущий момент дескриптор файла. ud этом, однако, мы поговорим позже.

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

while ( defined($filename = glob(«*.secret»)) ) ( open (WORDSLIST, $filename) 11

die «can’t open wordlist: $!»; f (-M WORDSLIST >= 7.0) ( while ($name = = ; chomp $word; Swords ($name ) = $word; ) ) close (WORDSLIST) II die «couldn’t close wordlist: $!»;

Сначала мы поместили в новый цикл while основную часть подпрограммы из предыдущей версии. Новый элемент здесь — функция glob. По историческим причинам она называется filename glob. Эта функция работает почти так же, как : при каждом обращении к ней она возвращает очередное значение из списка имен файлов, которые соответствуют образцу shell, в данном случае * . secret. Если таких имен файлов нет, возвращается пустая строка*.

Таким образом, если текущий каталог содержит файлы fred. secret и sarney.secret, то при первом выполнении цикла while значением переменной $fiiename будетЬагпеу. secret (именадаютсяпоалфавиту).При втором выполнении цикла значением $filename будет fred .secret. Поскольку при третьем вызове функции glob она возвращает пустую строку, го третий проход не делается, так как цикл while интерпретирует это значение как «ложь», что приводит к выходу из подпрограммы.

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

Отметим, что в отсутствие файлов, имена которых совпадали бы с шаблоном *. secret и «возраст» которых не превышал бы семи дней, подпрограмма завершится, не поместив ни одного секретного слова в массив %words. Это значит, что всем придется пользоваться словом groucho. Прекрасно. (В реальном коде перед выходом из подпрограммы следовало бы ввести операцию проверки количества элементов в массиве %words — и при неудовлетворительном результате выполнить функцию die. Обратите внимание на функцию keys, когда мы дойдем до определения хешей в главе 5.)

* Да-да, опять undef. /.

Как получить список секретных слов

Итак, Главный Директор Списков Секретных Слов желает получить отчет обо всех секретных словах, используемых в текущий момент, с указанием их «возраста». Если мы на минутку расстанемся с программой проверки секретного слова, у нас будет время написать для Директора программу формирования необходимого ему отчета.

Сперва давайте получим все наши секретные слова, воспользовавшись для этого частью кода из подпрограммы init_words ( ) :

while ( defined($filename = glob(«*.secret»)) ) ( open (WORDSLIST, $filename) II die «can’t open wordlist: $!»; if (-M WORDSLIST >= 7.0)

chomp ( $name ) ; $word = ; chomp (Sword) ;

*** отсюда начинается новый код >

) I close (WORDSLIST) 11 die «couldn’t close wordlist: $!»

К моменту достижения того места программы, где дан комментарий «отсюда начнется новый код», мы знаем три вещи: имя файла (содержится в переменной $filename), чье-то имя (в переменной $name) и секретное слово этого человека (содержится в $word). Здесь и нужно использовать имеющиеся в Perl инструменты формирования отчетов. Для этого где-то в программе мы должны определить используемый формат (обычно это делается в конце, как и для подпрограмм):

@“““““ $filename, $name, $word

Определение формата начинается строкой format stdout=, а завершается точкой. Две строки между первой строкой и точкой — это сам формат. Первая строка формата — это строка определения полей, в которой задается число, длина и тип полей. В этом формате у нас три поля. Строка, следующая за строкой определения полей — это всегда строка значений полей. Строка значений содержит список выражений, которые будут вычисляться при использовании формата; результаты вычисления этих выражений вставляются в поля, определенные в предыдущей строке.

Вызывается определенный таким образом формат функцией write, например:

while ( defined($filename = glob(«*.secret»)) ) ( open (WORDSLIST, $filename) 11 die «can’t open wordlist: $»‘;

close (WORDSLIST) II die «couldn’t close wordlist: $!»; >

@ @ @ $filename, $name, $word

Когда вызывается формат . Perl вычисляет выражения, имеющиеся в строке значений, и генерирует строку, которую передает в дескриптор файла stdout. Поскольку write вызывается один раз при каждом проходе цикла, мы получим ряд строк (под одной строке для каждого секретного слова); итоговый текст будет разбит на столбцы.

Гм-м. Мы забыли дать столбцам названия. Впрочем, это достаточно легко сделать. Нужно просто ввести формат начала страницы:


format STDOUT_TOP = Page @“ $%

Filename Name Word

Этот формат называется stdout_top; он будет использоваться при первом вызове формата stdout, а затем через каждые 60 строк, выведенных в stdout. заголовки столбцов позиционируются точно по столбцам формата ^tdout, поэтому все выглядит аккуратно.

В первой строке заголовка стоит неизменяемый текст (Page) и трехзначный определитель поля. Следующая строка — строка значений полей, в данном случае она содержит выражение. Это выражение является переменной $%*, в которой содержится число выведенных страниц.

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

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

* Благодаря модулю English можно использовать для этих предопределенных скалярных переменных более мнемонические псевдонимы легко запоминающиеся названия.

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

В Perl имеются также поля, которые центрируються и выравниваются по правому краю области вывода. Этот язык кроме тогоподдерживает одновременное выравнивание и по правому и по левому краям. Подпобно об этом мы поговорим ,

когда дойдем до форматов , в главе 11.

Как сделать старые списки слов более заметными

Просматривая файлы *.secret в текущем каталоге, мы, возможно, обнаружим слишком старые файлы. До сих пор мы просто пропускали их. Давайте сделаем очередной шаг и переименуем эти файлы в *.secret.old, чтобы в перечне содержимого сразу было видно — по имени — какие файлы необходимо обновить.

Вот как выглядит подпрограмма init_words () , модифицированная для выполнения такой операции:

Учебник Perl по-русски

Вы научитесь использовать CPAN и некоторые конкретные модули CPAN.

Так вы заложите хорошую основу знаний, которые позже сможете развивать.

Бесплатная онлайн-версия учебника создается сейчас. Многие части уже готовы. Новые материалы публикуются и переводятся каждые несколько дней. Последний перевод был опубликован 10 июля 2013 г. Если вы хотите получать уведомления, когда публикуются новые материалы, пожалуйста подпишитесь на рассылку.

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

Бесплатный онлайн Учебник для новичков — Perl Maven Tutorial

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

Вы узнаете как об основных свойствах языка, так и о расширениях (библиотеках), или, как их называют Perl-программисты, модулях. Мы рассмотрим как стандартные модули, входящие в установочный пакет Perl, так и модули сторонних разработчиков, размещаемые на CPAN.

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

Списки и массивы

  1. цикл foreach в Perl
  2. Цикл for в Perl
  3. Списки в Perl
  4. Использование модулей
  5. Массивы в Perl
  6. Обработка параметров командной строки @ARGV, Getopt::Long
  7. Как прочесть и обработать CSV-файл? (split, Text::CSV_XS) (How to read and process a CSV file? (split, Text::CSV_XS))
  8. join (join)
  9. Год 19100 (time, localtime, gmtime) и введение контекста (The year of 19100 (time, localtime, gmtime) and introducing context)
  10. Чувствительность к контексту Perl (Context sensitivity in Perl)
  11. Сортировка массивов в Perl (Sorting arrays in Perl)
  12. Уникальные значения в массиве в Perl (Unique values in an array in Perl)
  13. Управление массивами в Perl: shift, unshift, push, pop (Manipulating Perl arrays: shift, unshift, push, pop)
  14. Стек и очередь (Stack and queue)
  15. reverse
  16. троичный оператор
  17. Управление циклами: next и last
  18. min, max, sum с помощью List::Util

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

  1. Подпрограммы и функции в Perl (Subroutines and Functions in Perl)
  2. Передача и получение параметров в подпрограммах
  3. Переменное количество параметров
  4. Возвращение списка
  5. Рекурсивные подпрограммы

Хэши, массивы

  1. Хэши в Perl (словарь, ассоциативный массив, справочная таблица) (Perl Hashes (dictionary, associative array, look-up table))
  2. exists, delete для элементов хэша

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

  1. Регулярные выражения в Perl
  2. Regex: Классы символов
  3. Regex: Кванторы
  4. Regex: «Жадное» и «нежадное» сравнение
  5. Regex: Группировка и захватывание
  6. Regex: Якоря
  7. Настройки и модификаторы регулярных выражений
  8. Подстановка (поиск и замена)
  9. trim — убираем пробелы в начале и в конце (trim — remove leading and trailing spaces)

Perl и функции командной строки

  1. -X операторы в Perl
  2. Перенаправление потоков в Perl
  3. Запуск внешних программ с помощью system
  4. Unix-команды: rm, mv, chmod, chown, cd, mkdir, rmdir, ln, ls, cp
  5. Как удалить, скопировать или переименовать файл с помощью Perl (How to remove, copy or rename a file with Perl)
  6. Команды Windows/DOS: del, ren, dir
  7. Файловые подстановки (Wildcard’ы)
  8. Указатели на директории
  9. Обход дерева директории (find)

CPAN

  1. Скачивание и установка Perl (Strawberry Perl или ручная сборка) (Download and install Perl (Strawberry Perl or manual compilation))
  2. Скачивание и установка Perl с помощью Perlbrew
  3. Поиск и оценка модулей CPAN
  4. Скачивание и установка Perl-модулей со CPAN’а
  5. Как поменять @INC, чтобы находить Perl-модули в нестандартных местах? (How to change @INC to find Perl modules in non-standard locations?)
  6. Как поменять @INC на относительный адрес
  7. local::lib

Немного примеров использования Perl

  1. Как заменить строку файла с помощью Perl? (slurp) (How to replace a string in a file with Perl? (slurp))
  2. Чтение из Excel-файлов с помощью Perl
  3. Creating Excel files using Perl (Платная подписка (только по-английски))
  4. Отправка электронной почты с помощью Perl
  5. CGI-скрипты на Perl
  6. Web-приложения с помощью Perl: PSGI
  7. Разбор XML-файлов
  8. Чтение и запись JSON-файлов
  9. Работа с базами данных на Perl (DBI, DBD::SQLite, MySQL, PostgreSQL, ODBC) (Database access using Perl (DBI, DBD::SQLite, MySQL, PostgreSQL, ODBC))
  10. Работа с LDAP на Perl

Другое

  1. Splice — режем массивы вдоль и поперек (Splice to slice and dice arrays in Perl)
  2. Как создать Perl-модуль для повторного использования кода (How to create a Perl Module for code reuse)
  3. Объектно-ориентированный Perl с помощью Mooses (Object Oriented Perl using Mooses)
  4. Типы свойств в классах Perl при использовании Moose (Attribute types in Perl >Многомерные массивы (Multi dimensional arrays)

Объектно-ориентированный Perl с помощью Moo

  1. ООП с помощью Moo — скринкаст и текстовое объяснение основных принципов Moo, создание класса с единственным свойством, которое может быть либо «только для чтения» (неизменяемое), либо «для чтения и записи» (изменяемое). Создание экземпляра (объекта). OOP with Moo a screencast and text explaining the basics of Moo, creating a class with a single attrubue that can be either read-only (immutable) or read-write (mutable) attribute. Creating and instance (object).
  2. Платная подписка (только по-английски):
  3. Type checking with Moo. While Moo does not have a type-system it allows you to set-up type checking in the setters of the attributes.
  4. required attributes
  5. Moo attributes with default values
  6. Moo attribute predicate and clearer

For the original, visit the Perl Tutorial in English

Иллюстрированный самоучитель по Perl

Введение в мир Perl

История языка 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, связанного с созданием многоуровневой безопасной сети, объединявшей несколько компьютеров, разнесенных на большие расстояния. Работа была выполнена, но потребовалось создание отчетов на основе большого числа файлов с многочисленными перекрестными ссылками между ними.

Библиотека Интернет Индустрии I2R.ru

Малобюджетные сайты.

Продвижение веб-сайта.

Контент и авторское право.

Perl для чайников (Учебник, ч. 1/3)

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

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

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

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

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

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

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

print («hello, WORLD!\n»);

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

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

print («hello, WORLD!\n»); <>;

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

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

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

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

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

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

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

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

print «enter your name: «; $name = <>; print «hello $name!»; <>;

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

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

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

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

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

$dos = `dir`; print $dos; <>;

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

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

print «enter comand: «; chmod($com = <>); print `$com`; <>;

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

$com = <>; #Считать в $com chmod ($com); #Убрать всё лишнее

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

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

Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL