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

Язык программирования Perl создал Ларри Уолл (Larry Wall) в 1987 году, когда он работал системным программистом в американской компании Unisys. Цели, которые преследовал Ларри при разработке нового языка программирования, отражены в его названии - PERL, которое позднее стало расшифровываться как Practical Extraction and Report Language, то есть «практический язык извлечения „данных“ и „создания“ отчетов».

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

Хотя, по другой версии, Ларри назвал созданный им язык по имени своей невесты.


Ларри Уолл

На становление Perl повлияли языки Ada, Basic, Fortran, Lisp, Pascal и, конечно, язык C. Perl впитал в себя разные течения компьютерной науки: процедурное, модульное, функциональное и объектно-ориентированное программирование, макрообработку текста, а кроме этого - культуру ОС Unix, с ее богатым набором команд и утилит, стройной продуманной архитектурой и унифицированным подходом к представлению данных.

Наследие Unix

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

Для тех, кто знаком с операционной системой Unix, этот материал не будет новым. Но многим программистам, работающим с MS-DOS и Windows, важно познакомиться с принципами программирования, основанного на инструментальных средствах (softwaretools), которое зародилось и развивалось вместе с ОС Unix. О них написали замечательную книгу известные программисты Брайан Керниган (Brian W. Kernighan) и Филип Плоджер (Philip Plauger). Вот основные положения этого подхода.

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

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

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

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

Объединение инструментальных средств в приложения производится средствами командного языка ОС: перенаправление ввода-вывода, создание программных конвейеров (направление выходного потока одной программы на вход другой).

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

Для эффективной обработки слабо структурированной текстовой информации применяются регулярные выражения.

Благоприятные факторы

Язык быстро распространился среди пользователей сети Usenet. Несмотря на то, что в операционной системе (ОС) Unix, для которой был создан Perl, уже имелись многочисленные и разнообразные средства для обработки текстовой информации (awk, csh, grep, sed и другие), новый язык полюбился огромному числу системных администраторов и программистов. Он был легок в изучении и применении: синтаксис похож на С, Perl-программы не требовалось предварительно компилировать, исходные тексты было легко модифицировать. А самое главное - это был действительно очень практичный язык: с его помощью легко решалось большинство повседневных задач - от самых простых до очень сложных.

Активно пользуясь языком Perl, программисты из разных стран направляли Ларри Уоллу предложения добавить в него новые возможности или улучшить имеющиеся. Постепенно Perl превратился из средства обработки текстов в среде Unix в мощную универсальную систему программирования. В середине 1990-х годов, по мере развития интернета, Perl стал излюбленным инструментом web-мастеров для создания динамических сайтов и Internet-программирования.

Благодаря своим мощным встроенным средствам работы с текстовыми данными Perl широко используется для обработки информации в форматах HTML и XML.

Perl стал непременным компонентом любой поставки ОС семейства Unix (например, FreeBSD, Linux или Solaris). Кроме этого, к настоящему времени Perl реализован практически для всех современных аппаратных платформ (суперкомпьютеры, RISC, Macintosh, PC, наладонные компьютеры) и операционных систем (AIX, Linux, MacOS, MS-DOS, NetWare,OS/2, QNX, Solaris, Windows, VMS и так далее).

Это дает возможность легко переносить популярные Perl-программы из одного операционного окружения в другое.

Несомненно, его широкому применению способствовало и то, что он распространяется бесплатно на условиях одной из лицензий: либо GNU GeneralPublic License (GPL), либо Artistic License - на выбор. Но главное, что в нем есть все средства, чтобы отлично выручать профессионалов и неопытных программистов, когда требуется быстро решать разные системные и прикладные задачи - от самых простых до весьма сложных. В результате Perl стал одним из самых успешных проектов движения open source (с открытыми исходными кодами) - наряду с Apache, Linux, PHP и Python.

Необычный язык программирования

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

Во время обучения в университете Ларри Уолл получил лингвистическое образование. Кроме того, он занимался программированием и работал в университетском компьютерном центре.

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

Пишущие о языке Perl невольно употребляют термины «идиома», «метафора», «синоним», «контекст» и т.п., обычно применяемые к естественным языкам. А сам Ларри Уолл, описывая язык Perl, широко пользуется лингвистическими терминами: существительное, глагол, предложение, единственное и множественное число, местоимение.

Выдающийся лингвист Б.Л. Уорф заметил: «Язык формирует наш способ мыслить и определяет, о чем мы можем думать». Эту же мысль подтверждает Дж. Бентли в книге «Жемчужины творчества программистов», описывая случай, когда именно особенности языка программирования APL натолкнули разработчика на оригинальное решение задачи с массивами. В этом смысле Perl как язык для воплощения замыслов программиста, не сковывает фантазию разработчика, дает ему максимальную свободу самовыражения, а иногда даже подсказывает нестандартные решения.

В качестве недостатков языка упоминают :

Лингвистические принципы Perl

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

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

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

$we->shall(do($it)) if $you->want($it); # или
if $you->want($it) { $we->shall(do($it)) }

Принцип свободы в естественных языках предполагает, что всегда есть несколько вариантов выражения одной и той же мысли. Как и в естественных языках, в Perl одного и того же результата можно достичь несколькими способами, используя различные выразительные средства языка. Это так называемый принцип TIMTOWTDI- сокращение читается «Тим Тоуди» и расшифровывается как «There is more than one way to do it»: «есть более одного способа сделать что-то». В соответствии с ним каждый разработчик выбирает тот вариант языковой конструкции, который больше подходит ему в конкретной ситуации, больше соответствует его стилю или уровню знания языка.

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

Первые версии и «Верблюжья книга»

Ларри Уолл начал разработку Perl в 1987 году, когда работал программистом в Unisys. Версия 1.0 была выпущена и анонсирована 18 декабря 1987 года как «„замена“ для awk и sed».

Perl 2 был выпущен в 1988 году. Основным нововведением в нём был переработанный механизм регулярных выражений.

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

Изначально, единственной документацией для Perl была единственная (огромной длины) man-страница. В 1991 году была выпущена книга «Programming Perl» (известная многим программистам как «Верблюжья книга» (Camel Book) из-за изображения на обложке), которая, де-факто, стала стандартом языка.

В то же самое время, версия языка была «поднята» до 4 й - не столько чтобы указать на значительные изменения, сколько чтобы обозначить, что эта версия языка документирована книгой. Perl 4 прошёл через серию релизов, остановившись на Perl 4.036 в 1993 году.

Perl 5

Разработка Perl 5 была начата в 1994 году. В то же время был создан список рассылки perl5-porters для координации работы над портированием Perl 5 на различные платформы. Он до сих пор остаётся основным форумом по разработке, обслуживанию и портированию Perl 5.

Perl 5.000 был выпущен 17 октября 1994 года. Он включал в себя полностью переписанный интерпретатор, а также много новых языковых возможностей, таких, как объекты, ссылки, локальные переменные (my $var_name) и модули. Особенно важной частью были модули, так как они предоставили механизм расширения языка без модифицирования интерпретатора. Это позволило стабилизировать интерпретатор, но при этом, дало возможность обычным Perl-программистам добавлять в язык новые возможности. Perl 5 находится в активной разработке по сей день.

Perl 5.001 был выпущен 13 марта 1995 года. Perl 5.002 увидел свет 29 февраля 1996 года с новой поддержкой прототипов. Это позволило авторам модулей создавать функции, которые вели себя так же, как и встроенные функции Perl. Версия Perl 5.003 появилась 25 июня 1996 года и устранила обнаружившиеся проблемы с безопасностью.

Одно из важнейших событий в истории Perl 5 случилось за пределами собственно языка и было следствием поддержки модулей. 26 октября 1995 года начала свою работу CPAN (Comprehensive Perl Archive Network - «всеобъемлющая сеть архивов Perl»), которая стала репозиторием модулей Perl, а также исходного кода самого языка. На данный момент сеть насчитывает более 25 000 модулей, созданных более чем 8000 программистами.

Perl 5.004 был выпущен 15 мая 1997 года и содержал, кроме всего прочего, пакет UNIVERSAL, который давал языку основной объект, от которого автоматически происходили все классы. Была также включена возможность запрашивать версию модулей. В дополнение к этому Perl стал поддерживать Microsoft Windows, а также ряд других операционных систем.

Perl 5.005 увидел свет 22 июня 1998 года. Этот релиз включал в себя несколько улучшений процессора регулярных выражений, новые перехваты в бэкенд с помощью модулей B::*, оператор кавычек qr// для регулярных выражений, большой выбор других новых модулей, а также поддержку ряда операционных систем, в частности, BeOS.

2000-е годы

Perl 5.6 был выпущен 22 марта 2000 года. Главные изменения включали поддержку 64-битных систем, представление строк в стандарте Юникод, поддержку больших файлов (файлы больше 2 Гб) и ключевое слово our. Во время разработки Perl 5.6 было принято решение изменить схему наименования версий на более близкую к другим проектам с открытым исходным кодом. За версией 5.005_63 следовала версия 5.5.640; согласно плану, версиям в разработке должны были присваиваться нечётные номера, стабильным версиям - чётные.

В 2000 году Ларри Уолл выступил с призывом к сообществу активно обсуждать предложения к следующей версии Perl. Результатом этого обсуждения стал 361 документ RFC (Request for Comments - «запрос комментариев»), которые были использованы в разработке Perl 6.

В 2001 году была начата работа над окончательным документом, подводящим итог предложениям к созданию нового поколения Perl. Результат был представлен не в виде формального документа, а в качестве сводки всех RFC. К этому времени Perl 6 существовал исключительно в виде описания языка.

Perl 5.8 был впервые выпущен 18 июля 2002 года и с этого времени получал ежегодное обновление. Последняя версия Perl 5.8, под номером 5.8.9, увидела свет 14 декабря 2008 года. Perl 5.8 улучшил поддержку Юникода, добавил новую реализацию ввода-вывода, добавил поддержку многопоточности, увеличил числовую точность и добавил несколько новых модулей.

В 2004 году началась работа над Синопсисом (Synopsis) - первоначально задуманном как ряд документов, подводящих итоги окончательного документа, упоминавшегося выше. Однако постепенно этот ряд документов и стал спецификацией Perl 6. В феврале 2005 года Отриус Тан начала работу над Pugs - интерпретатором Perl 6, написанном на Haskell. Это было первой настоящей попыткой воплотить Perl 6 в реальность. Эта попытка заглохла в 2006 году.

Когда тебе за 20

18 декабря 2007 года, в день 20-летней годовщины Perl 1.0, была выпущена версия Perl 5.10.0. Эта версия содержала в себе ряд заметных нововведений, приближающих её к Perl 6. Одними из таких нововведений стали новые операторы switch (названных «given»/«when»), обновление регулярных выражений, а также «умный» оператор совпадения «~~».


«Жемчужный» юбилей

Примерно в это же время всерьёз началась разработка новой реализации Perl 6, известной как Rakudo Perl, разработанной в связке с виртуальной машиной Parrot. С ноября 2009 года Rakudo Perl регулярно обновляется каждый месяц и является на данный момент самой полной реализацией Perl 6.

Значительное изменение процесса разработки Perl 5 произошло после появления Perl 5.11. Сообщество разработчиков перешло на ежемесячный цикл выпусков, с планированием даты выпуска на три месяца вперёд.

12 апреля 2010 года Perl 5.12.0 был представлен общественности. Выдающиеся нововведения включают в себя поддержку нового синтаксиса package NAME VERSION, оператор Yada Yada (служащего для маркировки кода-заполнителя, который ещё не реализован), полное решение «проблемы 2038 года» (Y2038), перегрузку операторов регулярных выражений, поддержку DTrace (фреймворка динамической трассировки), а также полную поддержку стандарта Unicode 5.2.

7 сентября 2010 года был выпущен Perl 5.12.2, а 21 января 2011 - Perl 5.12.3. Эти выпуски содержат обновление модулей, а также некоторые изменения в документации. Версия 5.12.4 выпущена 20 июня 2011. Последняя версия этой ветви, 5.12.5, выпущена 10 ноября 2012.

Крайняя пятилетка

14 мая 2011 выпущен Perl 5.14. Поддержка JSON стала встроенной, начиная с версии 5.14.2. Последняя версия этой ветви, 5.14.4, выпущена 10 марта 2013.

20 мая 2012 выпущен Perl 5.16. Значимым новшеством является возможность указать нужную версию Perl, которую надо эмулировать, позволяя пользователям обновить Perl, но сохранить работоспособность старых скриптов, которые иначе стали бы несовместимыми с новой версией. Ядро Perl 5.16 поддерживает Unicode 6.1.

18 мая 2013 выпущен Perl 5.18. Значимые нововведения включают новые зацепки dtrace, лексические функции, увеличение числа включенных в ядро функций, пересмотр реализации хешей из соображений безопасности, поддержка Unicode 6.2.

27 мая 2014 года была выпущена новая стабильная версия - Perl 5.20.0. Разработка велась примерно 12 месяцев, начиная с Perl 5.18.0, и содержит примерно 470 000 изменённых строк среди 2900 файлов от 124 авторов.

В декабре 2015 года вышел Perl 5.22.1. Разработка велась 6 месяцев.

9 мая 2016 года была выпущена новая стабильная версия языка программирования Perl 5.24.0. Разработка велась примерно 11 месяцев, начиная с Perl 5.22.0, и содержит примерно 360 000 изменённых строк среди 1800 файлов от 77 авторов.

Согласно данным на июль 2016 года, индекс TIOBE, который измеряет рост популярности языков программирования, показал, что Perl занимает 9 место:

Это на 2 позиции выше, чем в прошлом году.

Perl 6

Как отмечается в «Википедии», Perl 6 - очередная версия языка программирования Perl (с точки зрения строения, Perl 6 удобнее рассматривать как самостоятельный язык программирования). Является революционным развитием языка, последний написан практически «с чистого листа». Впервые за всю историю Perl разработка новой версии была начата с написания спецификаций, которые претерпевают изменения и по сей день.

Perl 6, компилируя программу, создаёт байт-код, который в дальнейшем исполняет виртуальная машина. Тот же подход применяется в технологиях Java и.NET Framework.

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

Разработка Perl 6 началась в 2000 году и продолжается и по сей день.

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

Ларри Уолл в шутку провозгласил три главных добродетели программиста: лень, нетерпение и самомнение. По его мнению, Perl спроектирован так, чтобы соответствовать этим качествам разработчика.

Сегодня мы предлагаем вам ознакомиться с одним из курсов Техносферы, который посвящён программированию на Perl. Этот курс открытый - на него может записаться любой студент или аспирант МГУ имени М.В. Ломоносова. Также в Техносфере есть еще несколько , 1 сентября на них открывается запись. В этом семестре вас ждет приятное дополнение: они будут подкреплены методическим материалом, который будет содержать достаточно информации, чтобы по нему можно было вспомнить материал любой лекции и при необходимости более глубоко её изучить.

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

Лекция 1. Введение

История создания языка Perl. Сравнение производительности. Примеры проектов. Документация (perldoc). Настройка окружения. Запуск скриптов (perlrun). Модуль Deparse. Модуль Data::Dumper. Модуль DDP. Отладка perl-скриптов (perldebug).

Лекция 2. Синтаксис и данные

Базовый синтаксис (условия, циклы, управляющие функции, постфиксная нотация). Переменные (основные типы, ссылки, интерполяция). Функции (декларирование, аргументы, контекст, прототипы, встроенные функции, grep/map/sort, eval). Операторы (порядок исполнения, особенные операторы, числа и строки).

Лекция 3. Модульность и повторное использование

Include. Блоки фаз. Package. Экспорт. Версии. Pragmatic modules. No. Symblo tables. CPAN.

Лекция 4. Регулярные выражения и юникод

Поддержка Unicode (определения, строки и октеты, преобразования, UTF8-flag, ввод/вывод). Регулярные выражения (сопоставление, поиск и замена, транслитерация, классы символов, модификаторы, группы, оглядывания, захваты, квантификаторы, работа с юникодом, отладка).

Лекция 5. Общение с внешним миром

Работа с файлами. Perl IO backend. Взаимодействие процессов. Работа с сокетами. Сериализация (преобразование данных в двоичный вид, JSON, CBOR, MSGPACK, Storable, XML). Разбор входных параметров.

Лекция 6. ООП

Методы. Примеры. Наследование. Method resolution order. Детали. Moose-like.

Лекция 7. Работа с базами данных

SQL. DBI. Connect. SQL-инъекции. Prepare, execute. Fetchrow. Fetchall_arrayref. Fetchall_hashref. Selectrow. Selectall. Ошибки. Транзации. Last_insert_id. DBIx::Class. Файлы. Resultset, result. Search. Find, single. Count. Relations. Join. Prefetch. Update, delete. Many_to_many. Storage. DBIx::Class::Schema::Loader. SQL::Translator. Memcached.

Лекция 8. Веб-приложения изнутри

Протокол HTTP. CGI, mod_perl, FastCGI, PSGI. Веб-фреймворки. Механизмы безопасности в приложениях.

Лекция 9. Асинхронно-событийное программирование

Работа операционной системы (параллелизм и псевдопараллелизм, состояние процесса и переключение контекста, степень многозадачности, системный вызов, блокирующие операции ввода-вывода). Обработка N параллельных соединений (accept + fork, C10k, неблокирующие операции ввода-вывода, событийный цикл). AnyEvent (замыкания, функции с отложенным результатом, интерфейс AnyEvent, Guard). Coro.

Лекция 10. Ускоряем Перл. Расширяем «С»

Генерация XS-модулей. Макропроцессор. Типы данных изнутри. Работа со стеком. Typemaps. Встраивание Perl (perlembed).

Лекция 11-12. Тестирование. Анализ производительности

Функциональное тестирование. Тестирование производительности. Нагрузочное тестирование. Юзабилити-тестирование. Тестирование интерфейса пользователя. Тестирование безопасности. Тестирование локализации. Тестирование совместимости. Профилирование. Бенчмарки. Поиск утечек в Pure Perl. Поиск утечек в XS.

Подписывайтесь на наш youtube-канал Технострим Mail.Ru ! Там вы найдете все лекции, мастер-классы и трансляции наших образовательных проектов.

Язык программирования Perl создал Ларри Уолл (Larry Wall) в 1987 году, когда он работал системным программистом в американской компании Unisys. Цели, которые преследовал Ларри при разработке нового языка программирования, отражены в его названии - PERL, которое позднее стало расшифровываться как Practical Extraction and Report Language, то есть «практический язык извлечения „данных“ и „создания“ отчетов».

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

Хотя, по другой версии, Ларри назвал созданный им язык по имени своей невесты.


Ларри Уолл

На становление Perl повлияли языки Ada, Basic, Fortran, Lisp, Pascal и, конечно, язык C. Perl впитал в себя разные течения компьютерной науки: процедурное, модульное, функциональное и объектно-ориентированное программирование, макрообработку текста, а кроме этого - культуру ОС Unix, с ее богатым набором команд и утилит, стройной продуманной архитектурой и унифицированным подходом к представлению данных.

Наследие Unix

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

Для тех, кто знаком с операционной системой Unix, этот материал не будет новым. Но многим программистам, работающим с MS-DOS и Windows, важно познакомиться с принципами программирования, основанного на инструментальных средствах (softwaretools), которое зародилось и развивалось вместе с ОС Unix. О них написали замечательную книгу известные программисты Брайан Керниган (Brian W. Kernighan) и Филип Плоджер (Philip Plauger). Вот основные положения этого подхода.

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

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

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

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

Объединение инструментальных средств в приложения производится средствами командного языка ОС: перенаправление ввода-вывода, создание программных конвейеров (направление выходного потока одной программы на вход другой).

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

Для эффективной обработки слабо структурированной текстовой информации применяются регулярные выражения.

Благоприятные факторы

Язык быстро распространился среди пользователей сети Usenet. Несмотря на то, что в операционной системе (ОС) Unix, для которой был создан Perl, уже имелись многочисленные и разнообразные средства для обработки текстовой информации (awk, csh, grep, sed и другие), новый язык полюбился огромному числу системных администраторов и программистов. Он был легок в изучении и применении: синтаксис похож на С, Perl-программы не требовалось предварительно компилировать, исходные тексты было легко модифицировать. А самое главное - это был действительно очень практичный язык: с его помощью легко решалось большинство повседневных задач - от самых простых до очень сложных.

Активно пользуясь языком Perl, программисты из разных стран направляли Ларри Уоллу предложения добавить в него новые возможности или улучшить имеющиеся. Постепенно Perl превратился из средства обработки текстов в среде Unix в мощную универсальную систему программирования. В середине 1990-х годов, по мере развития интернета, Perl стал излюбленным инструментом web-мастеров для создания динамических сайтов и Internet-программирования.

Благодаря своим мощным встроенным средствам работы с текстовыми данными Perl широко используется для обработки информации в форматах HTML и XML.

Perl стал непременным компонентом любой поставки ОС семейства Unix (например, FreeBSD, Linux или Solaris). Кроме этого, к настоящему времени Perl реализован практически для всех современных аппаратных платформ (суперкомпьютеры, RISC, Macintosh, PC, наладонные компьютеры) и операционных систем (AIX, Linux, MacOS, MS-DOS, NetWare,OS/2, QNX, Solaris, Windows, VMS и так далее).

Это дает возможность легко переносить популярные Perl-программы из одного операционного окружения в другое.

Несомненно, его широкому применению способствовало и то, что он распространяется бесплатно на условиях одной из лицензий: либо GNU GeneralPublic License (GPL), либо Artistic License - на выбор. Но главное, что в нем есть все средства, чтобы отлично выручать профессионалов и неопытных программистов, когда требуется быстро решать разные системные и прикладные задачи - от самых простых до весьма сложных. В результате Perl стал одним из самых успешных проектов движения open source (с открытыми исходными кодами) - наряду с Apache, Linux, PHP и Python.

Необычный язык программирования

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

Во время обучения в университете Ларри Уолл получил лингвистическое образование. Кроме того, он занимался программированием и работал в университетском компьютерном центре.

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

Пишущие о языке Perl невольно употребляют термины «идиома», «метафора», «синоним», «контекст» и т.п., обычно применяемые к естественным языкам. А сам Ларри Уолл, описывая язык Perl, широко пользуется лингвистическими терминами: существительное, глагол, предложение, единственное и множественное число, местоимение.

Выдающийся лингвист Б.Л. Уорф заметил: «Язык формирует наш способ мыслить и определяет, о чем мы можем думать». Эту же мысль подтверждает Дж. Бентли в книге «Жемчужины творчества программистов», описывая случай, когда именно особенности языка программирования APL натолкнули разработчика на оригинальное решение задачи с массивами. В этом смысле Perl как язык для воплощения замыслов программиста, не сковывает фантазию разработчика, дает ему максимальную свободу самовыражения, а иногда даже подсказывает нестандартные решения.

В качестве недостатков языка упоминают :

Лингвистические принципы Perl

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

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

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

$we->shall(do($it)) if $you->want($it); # или
if $you->want($it) { $we->shall(do($it)) }

Принцип свободы в естественных языках предполагает, что всегда есть несколько вариантов выражения одной и той же мысли. Как и в естественных языках, в Perl одного и того же результата можно достичь несколькими способами, используя различные выразительные средства языка. Это так называемый принцип TIMTOWTDI- сокращение читается «Тим Тоуди» и расшифровывается как «There is more than one way to do it»: «есть более одного способа сделать что-то». В соответствии с ним каждый разработчик выбирает тот вариант языковой конструкции, который больше подходит ему в конкретной ситуации, больше соответствует его стилю или уровню знания языка.

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

Первые версии и «Верблюжья книга»

Ларри Уолл начал разработку Perl в 1987 году, когда работал программистом в Unisys. Версия 1.0 была выпущена и анонсирована 18 декабря 1987 года как «„замена“ для awk и sed».

Perl 2 был выпущен в 1988 году. Основным нововведением в нём был переработанный механизм регулярных выражений.

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

Изначально, единственной документацией для Perl была единственная (огромной длины) man-страница. В 1991 году была выпущена книга «Programming Perl» (известная многим программистам как «Верблюжья книга» (Camel Book) из-за изображения на обложке), которая, де-факто, стала стандартом языка.

В то же самое время, версия языка была «поднята» до 4 й - не столько чтобы указать на значительные изменения, сколько чтобы обозначить, что эта версия языка документирована книгой. Perl 4 прошёл через серию релизов, остановившись на Perl 4.036 в 1993 году.

Perl 5

Разработка Perl 5 была начата в 1994 году. В то же время был создан список рассылки perl5-porters для координации работы над портированием Perl 5 на различные платформы. Он до сих пор остаётся основным форумом по разработке, обслуживанию и портированию Perl 5.

Perl 5.000 был выпущен 17 октября 1994 года. Он включал в себя полностью переписанный интерпретатор, а также много новых языковых возможностей, таких, как объекты, ссылки, локальные переменные (my $var_name) и модули. Особенно важной частью были модули, так как они предоставили механизм расширения языка без модифицирования интерпретатора. Это позволило стабилизировать интерпретатор, но при этом, дало возможность обычным Perl-программистам добавлять в язык новые возможности. Perl 5 находится в активной разработке по сей день.

Perl 5.001 был выпущен 13 марта 1995 года. Perl 5.002 увидел свет 29 февраля 1996 года с новой поддержкой прототипов. Это позволило авторам модулей создавать функции, которые вели себя так же, как и встроенные функции Perl. Версия Perl 5.003 появилась 25 июня 1996 года и устранила обнаружившиеся проблемы с безопасностью.

Одно из важнейших событий в истории Perl 5 случилось за пределами собственно языка и было следствием поддержки модулей. 26 октября 1995 года начала свою работу CPAN (Comprehensive Perl Archive Network - «всеобъемлющая сеть архивов Perl»), которая стала репозиторием модулей Perl, а также исходного кода самого языка. На данный момент сеть насчитывает более 25 000 модулей, созданных более чем 8000 программистами.

Perl 5.004 был выпущен 15 мая 1997 года и содержал, кроме всего прочего, пакет UNIVERSAL, который давал языку основной объект, от которого автоматически происходили все классы. Была также включена возможность запрашивать версию модулей. В дополнение к этому Perl стал поддерживать Microsoft Windows, а также ряд других операционных систем.

Perl 5.005 увидел свет 22 июня 1998 года. Этот релиз включал в себя несколько улучшений процессора регулярных выражений, новые перехваты в бэкенд с помощью модулей B::*, оператор кавычек qr// для регулярных выражений, большой выбор других новых модулей, а также поддержку ряда операционных систем, в частности, BeOS.

2000-е годы

Perl 5.6 был выпущен 22 марта 2000 года. Главные изменения включали поддержку 64-битных систем, представление строк в стандарте Юникод, поддержку больших файлов (файлы больше 2 Гб) и ключевое слово our. Во время разработки Perl 5.6 было принято решение изменить схему наименования версий на более близкую к другим проектам с открытым исходным кодом. За версией 5.005_63 следовала версия 5.5.640; согласно плану, версиям в разработке должны были присваиваться нечётные номера, стабильным версиям - чётные.

В 2000 году Ларри Уолл выступил с призывом к сообществу активно обсуждать предложения к следующей версии Perl. Результатом этого обсуждения стал 361 документ RFC (Request for Comments - «запрос комментариев»), которые были использованы в разработке Perl 6.

В 2001 году была начата работа над окончательным документом, подводящим итог предложениям к созданию нового поколения Perl. Результат был представлен не в виде формального документа, а в качестве сводки всех RFC. К этому времени Perl 6 существовал исключительно в виде описания языка.

Perl 5.8 был впервые выпущен 18 июля 2002 года и с этого времени получал ежегодное обновление. Последняя версия Perl 5.8, под номером 5.8.9, увидела свет 14 декабря 2008 года. Perl 5.8 улучшил поддержку Юникода, добавил новую реализацию ввода-вывода, добавил поддержку многопоточности, увеличил числовую точность и добавил несколько новых модулей.

В 2004 году началась работа над Синопсисом (Synopsis) - первоначально задуманном как ряд документов, подводящих итоги окончательного документа, упоминавшегося выше. Однако постепенно этот ряд документов и стал спецификацией Perl 6. В феврале 2005 года Отриус Тан начала работу над Pugs - интерпретатором Perl 6, написанном на Haskell. Это было первой настоящей попыткой воплотить Perl 6 в реальность. Эта попытка заглохла в 2006 году.

Когда тебе за 20

18 декабря 2007 года, в день 20-летней годовщины Perl 1.0, была выпущена версия Perl 5.10.0. Эта версия содержала в себе ряд заметных нововведений, приближающих её к Perl 6. Одними из таких нововведений стали новые операторы switch (названных «given»/«when»), обновление регулярных выражений, а также «умный» оператор совпадения «~~».


«Жемчужный» юбилей

Примерно в это же время всерьёз началась разработка новой реализации Perl 6, известной как Rakudo Perl, разработанной в связке с виртуальной машиной Parrot. С ноября 2009 года Rakudo Perl регулярно обновляется каждый месяц и является на данный момент самой полной реализацией Perl 6.

Значительное изменение процесса разработки Perl 5 произошло после появления Perl 5.11. Сообщество разработчиков перешло на ежемесячный цикл выпусков, с планированием даты выпуска на три месяца вперёд.

12 апреля 2010 года Perl 5.12.0 был представлен общественности. Выдающиеся нововведения включают в себя поддержку нового синтаксиса package NAME VERSION, оператор Yada Yada (служащего для маркировки кода-заполнителя, который ещё не реализован), полное решение «проблемы 2038 года» (Y2038), перегрузку операторов регулярных выражений, поддержку DTrace (фреймворка динамической трассировки), а также полную поддержку стандарта Unicode 5.2.

7 сентября 2010 года был выпущен Perl 5.12.2, а 21 января 2011 - Perl 5.12.3. Эти выпуски содержат обновление модулей, а также некоторые изменения в документации. Версия 5.12.4 выпущена 20 июня 2011. Последняя версия этой ветви, 5.12.5, выпущена 10 ноября 2012.

Крайняя пятилетка

14 мая 2011 выпущен Perl 5.14. Поддержка JSON стала встроенной, начиная с версии 5.14.2. Последняя версия этой ветви, 5.14.4, выпущена 10 марта 2013.

20 мая 2012 выпущен Perl 5.16. Значимым новшеством является возможность указать нужную версию Perl, которую надо эмулировать, позволяя пользователям обновить Perl, но сохранить работоспособность старых скриптов, которые иначе стали бы несовместимыми с новой версией. Ядро Perl 5.16 поддерживает Unicode 6.1.

18 мая 2013 выпущен Perl 5.18. Значимые нововведения включают новые зацепки dtrace, лексические функции, увеличение числа включенных в ядро функций, пересмотр реализации хешей из соображений безопасности, поддержка Unicode 6.2.

27 мая 2014 года была выпущена новая стабильная версия - Perl 5.20.0. Разработка велась примерно 12 месяцев, начиная с Perl 5.18.0, и содержит примерно 470 000 изменённых строк среди 2900 файлов от 124 авторов.

В декабре 2015 года вышел Perl 5.22.1. Разработка велась 6 месяцев.

9 мая 2016 года была выпущена новая стабильная версия языка программирования Perl 5.24.0. Разработка велась примерно 11 месяцев, начиная с Perl 5.22.0, и содержит примерно 360 000 изменённых строк среди 1800 файлов от 77 авторов.

Согласно данным на июль 2016 года, индекс TIOBE, который измеряет рост популярности языков программирования, показал, что Perl занимает 9 место:

Это на 2 позиции выше, чем в прошлом году.

Perl 6

Как отмечается в «Википедии», Perl 6 - очередная версия языка программирования Perl (с точки зрения строения, Perl 6 удобнее рассматривать как самостоятельный язык программирования). Является революционным развитием языка, последний написан практически «с чистого листа». Впервые за всю историю Perl разработка новой версии была начата с написания спецификаций, которые претерпевают изменения и по сей день.

Perl 6, компилируя программу, создаёт байт-код, который в дальнейшем исполняет виртуальная машина. Тот же подход применяется в технологиях Java и.NET Framework.

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

Разработка Perl 6 началась в 2000 году и продолжается и по сей день.

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

Ларри Уолл в шутку провозгласил три главных добродетели программиста: лень, нетерпение и самомнение. По его мнению, Perl спроектирован так, чтобы соответствовать этим качествам разработчика.

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

Perl был создан в 1986 году как инструмент для администрирования и конфигурирования системных ресурсов сети, состоящей из Unix-компьютеров. Он сочетает в себе лучшие чертыC,shell,sedиawk, поэтому для тех, кто знаком с ними, изучение Perl-а не представляет особого труда. Cинтаксис выражений Perl-а близок к синтаксисуC. В отличие от большинства утилит ОСUNIXPerl не ставит ограничений на объем обрабатываемых данных и если хватает ресурсов, то весь файл обрабатывается как одна строка. Рекурсия может быть произвольной глубины. Хотя Perl приспособлен для сканирования текстовых файлов, он может обрабатывать так же двоичные данные и создавать.dbm файлы, подобные ассоциативным массивам. Perl позволяет использовать регулярные выражения, создавать объекты, вставлять в программу наСилиC++куски кода на Perl-е, а также позволяет осуществлять доступ к базам данных.

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

Хотя CGI-приложения можно писать практически на любом языке,PerlиCGI-программирование стали синонимами для многих програм­мистов. Как сказал Хасан Шрейдер (HassanShroeder), первый вебмастерSun, «Perl- это артерия Интернета».Perl- самый широко исполь­зуемый язык дляCGI-программирования, и для этого есть много веских причин:

Perlлегко выучить: его синтаксис напоминает другие языки (например С), потому что он «многое прощает», - при ошибке выда­ется подробное сообщение, помогающее быстро локализовать про­блему.

Perlспособствует быстрой разработке, так как это интерпретируе­мый язык; исходный код не надо компилировать перед запуском.

Perlдоступен на многих платформах с минимальными измене­ниями.

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

Perlобрабатывает двоичные данные так же легко, как и текст.

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

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

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

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

РНР изобретен Расмусом Лердорфом в конце 1994 года. Первая вер­сия выпущена в 1995 году под именем «Инструментарий Персональ­ных Домашних Страниц», затем она была переработана и названа PHP/FI Version 2 (FI - модуль обработки данных для форм). Так­же была добавлена поддержка баз данных mSQL. С этого момента в разработке стали принимать участие добровольцы.

Статистика используемости РНР приблизительна, но, согласно ис­следованию, проведенному Netcraft, в начале 2001 года РНР исполь­зовался на более чем 5 300 000 сайтах по всему миру. Для сравне­ния: в это время число IIS серверов было примерно таким же (5 млн). Разработка интерпретатора РНР приняла форму организованного командного процесса, ядро интерпретатора разрабатывает компания Zend.com. При этом РНР распространяется свободно: его последнюю версию можно загрузить с сайта PHP.net. Модули РНР поставляют­ся в комплекте с сервером Apache, в комплектах систем Linux.

Изначально аббревиатура РНР означалаPreprocessor of Home Pages - препроцессор домашних страниц . Это язык внедряемых в HTML-страницы сценариев, исполняемых на сервере. По большей части его синтаксис заимствован из таких языков, как С, Perl, Java, и при этом добавлена масса возможностей, которых этим языкам недостает. Про­ще говоря, синтаксис РНР - это разумная альтернатива и строго­сти С, и «беспредельности» Perl.

РНР наделен практически полным набором функциональности, о ко­торой (до появления РНР) мог только мечтать web-программист. Его цель - позволить максимально быстро создавать динамически гене­рируемые web-страницы. С полным основанием можно заявить, что изучение и использование РНР будет выгодно как начинающим, так и профессиональным программистам.

Основными конкурентами РНР являются технологии JSP (J ava Server Pages и Java Scriptlets), ASP (Active Server Pages), Perl, SSI (Server Side Includes), Cold Fusion Server Pages.

Рассмотрим те недостатки, которые присущи указанным технологиям. JSP - достаточно слож­ный для изучения и использования язык. ASP , основанный на син­таксисе VBScript (Visual Basic), имеет всего несколько десятков соб­ственных функций и поэтому вынужден использовать СОМ-объекты; кроме того, он ориентирован исключительно на работу под Windows. Perl - язык головоломный, и его вольности затрудняют его понима­ние. SSI позволяет всего лишь компоновать HTML-страницу из не­скольких файлов. CF - коммерческий продукт, что является его ос­новным недостатком.

Основные достоинства РНР :

    бесплатен; постоянно совершенству­ется; работает на UNIX и Windows платформах;

    допускает работу с большинством СУБД;

    имеет широкий набор функций (более 3 тыс.);

    допускает объектно-ориентированное программирование;

    способен использовать протоколы HTTP, FTP, ШАР, SNMP, NNTP, РОРЗ, net sockets и другие;

    позволяет выполнять все операции, что и пере­численные его конкуренты, и даже работать с файлами графики. Можно также запускать РНР-скрипты как интерпретируемые файлы и компилировать исполняемые приложения (в том числе с под­держкой графического интерфейса GTK).

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

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

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

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

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

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

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

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

Привет, %username%!

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

#!/usr/bin/perl

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

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

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

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

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

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

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

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

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

#!/usr/bin/perl

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

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

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

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

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

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

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

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

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

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

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

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

#!/usr/bin/perl

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

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

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

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

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

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

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

#!/usr/bin/perl

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

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

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

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

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

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

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

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

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