Изучаем perl. Быстрый старт в Perl. Стоимость и лицензия

Одна из увлекательных вещей относительно Perl 6 заключается в умопомрачительной легкости, с которой происходит создание новых модулей/библиотек и добавление их в Perl 6 Ecosystem (аналог CPAN для Perl 6). Давайте разберемся, как создаются новые модули для Perl 6.

Разглядим в качестве примера модуль Sitemap::XML::Parser. Содержимое соответственного репозитория на GitHub последующее:

.
+-- lib
¦ L-- Sitemap
¦ L-- XML
¦ L-- Parser.pm6

META.info

README
L-- t
L-- main.t

Что содержит в себе модуль Perl 6:

Разумеется, возможно обойтись без тестов и тем паче без логотипа.

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

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

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

Испытания находятся в каталоге./t в файлах с расширением t. По сути это обыденные скрипты на Perl 6. Вот вам наглядный пример простого автоматического теста, который в реальности ничего не инспектирует:

Use v6;
use lib "lib";
use Test;


ok(1);

Для прогона тестов используйте команду:

Prove -e perl6 ./t

Главные модули, которые пригодятся для вас при написании тестов - это Test и Test::Mock. Как нетрудно додуматься, 1-ый предназначен фактически для написания тестов, а 2-ой - для сотворения mock-объектов. Примеры использования обоих модулей можно поглядеть тут.

См также выборку ссылок в конце заметки.

Примечание: На всякий случай обращаю ваше внимание, что испытания не должны писаться в предположении, что у юзера на localhost поднят Memcached либо типа того. По мере надобности используйте mock-объекты и помните, что вы пишите модульные (и время от времени интеграционные) испытания, которые не должны зависеть от подобного рода вещей. Как указывает практика, для неких программистов это не разумеется.

В файле META.info содержится имя, версия и короткое описание модуля, также перечень зависимостей, тип и адресок репозитория. Формат файла представляет собой обыденный JSON:

{
"name" : "Sitemap::XML::Parser",
"version" : "*",
"description" : "A Perl 6 module for parsing sitemap.xml files",

"depends" : [
"LWP::Simple",
"XML::Parser::Tiny",

"DateTime::Format::W3CDTF"
],
"source-type" : "git",
"source-url" : "git://github.com/afiskon/p6-sitemap-xml-parser.git"
}

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

Perl6 --doc ./lib/Sitemap/XML/Parser.pm6 > ./README

Используя этот подход, для вас не придется волнуется о том, как поддерживать файл README в животрепещущем состоянии.

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

Итак, вы сделали некоторый нужный модуль, написали к нему документацию и как надо покрыли его тестами. Что требуется для того, чтоб другие программеры могли установить его при помощи panda?

Для этого делаем форк репозитория https://github.com/perl6/ecosystem/, добавляем в конце файла META.list ссылку на файл META.info в собственном репозитории и шлем pull request. GitHub позволяет сделать все это в пару кликов прямо через веб-интерфейс.

По моему опыту конфигурации принимают достаточно стремительно, обычно в течение часа либо около того. Спустя еще какое-то время ваш модуль появится в файле http://feather.perl6.nl:3000/projects.json. Конкретно этот файл употребляется panda для получения полного перечня всех имеющихся модулей для Perl 6. Пробуем установить модуль:

Panda update
panda install Sitemap::XML::Parser

Проверяем, что испытания проходят, документация просматривается через p6doc и т.д.. Спустя еще какое-то время ссылка на ваш модуль появится на modules.perl6.org. Если вы написали что-то полезное, новые тикеты в багтрекере, форки и pull request’ы не принудят себя длительно ожидать.

Так как все модули Perl 6, как и вообщем все, связанное с Perl 6, хранятся в git-репозиториях на GitHub (хотя, как я понимаю, можно использовать не только лишь GitHub и не только лишь Git), вы сможете без усилий сделать лучше хоть какой из их - поправить ошибку, дописать документацию и тп. Либо, скажем, просто использовать их в качестве обучающих примеров.

Появился в 1987 году.

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

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

Perl - это единственный язык, программы на котором выглядят одинаково до и после RSA-шифрования.

На момент написания этого материала актуальной версией интерпретатора является 5.22.0 . Perl 6 готовится к релизу в 2015 году, но еще недостаточно документирован.

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

PHP - это маленькое зло, созданное некомпетентными новичками, в то время как Perl - это большое и коварное зло, созданное умелыми, но извращёнными профессионалами.

К слову сказать, с PHP начинать тоже не стоит. А теперь ближе к делу.

Среда исполнения

На данный момент Perl официально поддерживается тремя ведущими платформами: Mac OS X, Unix и Windows. На первых двух из них среда исполнения Perl является предустановленной, и ее версию можно узнать через команду perl -v (свежую версию можно скачать ), а для операционных систем семейства Windows интерпретатор Perl доступен для скачивания на этой странице . Рекомендуется выбирать ActivePerl (дистрибутив от ActiveState) как самый распространенный.

Интегрированная среда разработки (IDE)

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

Padre, the Perl IDE

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

Текстовые редакторы

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

  • KomodoEdit - урезанная версия коммерческой среды разработки Komodo IDE, разрабатываемая ActiveState (той самой, которая поддерживает дистрибутив ActivePerl), располагает функциями автодополнения, подсветки синтаксиса, множественных курсоров и подсказок из документации;
  • Vim - текстовый редактор, интерфейс которого может оказаться непривычным для Windows-пользователя; поддерживает подсветку синтаксиса;
  • Sublime Text - один из самых инструментов редактирования исходного кода с подсветкой синтаксиса, автодополнением и т.п., функционал которого расширяется множеством существующих плагинов;
  • Notepad++ - легковесный текстовый редактор, отличающийся наиболее корректной, после KomodoEdit, подсветкой синтаксиса; функционал может быть расширен плагинами, однако специально для Perl их существует довольно мало.

CodeGround

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

Первый «Привет, мир!» на Perl

Традиционно предлагаем начать знакомство с новым языком со всем хорошо известной программы:

Print "Hello World\n";

Сохраните эту строку в файле hello.pl и запустите только что созданную вами программу командой:

Perl hello.pl

Однако прежде убедитесь, что исполняемые файлы Perl есть среди ваших переменных среды (переменных окружения), а также в том, что вы вызывается perl из папки с исходным файлом hello.pl . В случае успеха, вы увидите ожидаемое «Hello, world!»

Поздравляем, вы начали писать на Perl!

А дальше - в путь …

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

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

/usr/etc/httpd/cgi-bin/ и его подкаталоги. Обсудите зтот вопрос с Web-мастером или системным администратором.

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

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

http://vww.SOMEWHERE.org/cgi-bin/howdy.

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

www.SOMEWHERE.org, может запросто перевести cgi-bin/howdy, содержащийся в зтом URL, в нечто вроде usr/etc/httpd/ cgi-bin/howdy. Ваш системний администратор или Web-мастер может подска-зать, какой псевдоним следует использовать при обращении к вашей программе. Зтот заголовок необходим для протокола HTTP, о котором мы упоминали выше.

Передача параметров через

CGI

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

URL на http://www.SOMEWHERE.org/cgi-bin/ice_creain?flavor=mint.

Когда вы "нацеливаете" свой броузер на этот

URL, броузер не только просит Web-сервер вызвать программу ice_cream, но и передает в нее строку flavor=mint. Теперь дело программы - прочитать данную строку-аргумент и разобрать ее. Эта задача не так проста, как кажется. Многие программы пытаются решить ее и разобрать запрос самостоятельно, но большинство "самодельных" алгоритмов время от времени отказывают. Учитывая то, насколько сложно найти правильное решение такой задачи для всех возможных случаев, вам, наверное, не следует писать код самим, особенно при наличии отличных готовых модулей, которые выполняют этот хитрый синтаксический анализ за вас.

К вашим услугам

- модуль CGI.pm, который всегда разбирает входящий CGI-запрос правильно. Чтобы вставить этот модуль в свою программу, просто напишите

где-нибудь в начале программы*.

Оператор

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

В данном случае все, что нам нужно использовать из модуля

CGI.pm - это функция param () **.

Если аргументы не указаны, функция

param () возвращает список всех полей, имевшихся в HTML-форме, на которую отвечает данный CGI-сце-нарий. (В текущем примере это поле flavor, а в общем случае - список всех имен, содержащихся в строках имя=значение переданной формы.) Если указан аргумент, обозначающий поле, то param () возвращает значение (или значения), связанные с этим полем. Следовательно, param (" flavor") возвращает "mint", потому что в конце URL мы передали ?flavor=mint. Имена всех Perl-модулей имеют расширение рт. Более того, оператор use подразумевает это расширение. О том, как создавать свои собственные модули, вы можете узнать в главе 5 книги Programming Perl или на man-странице perlmod(l). Некоторые модули автоматически экспортируют все свои функции, но, поскольку CGI.pm - это на самом деле объектный модуль, замаскированный под обычный, мы должны запрашивать его функции явно.

Несмотря на то что в нашем списке для оператора

use имеется всего один элемент, мы будем использовать запись qw (). Благодаря этому нам будет легче впоследствии раскрыть этот список.

#!/usr/local/bin/perlS -w

# программа ответа на форму о любимом сорте мороженого (версия

1) use CGI qw(param);

print “END_of_Start;

Content-type: text/html

Hello World

Greetings, Terrans! END_of_Start

print "

Your favorite flavor is $favorite. print “All_Done;

All Done

Как сократить объем вводимого текста

Вводить все равно приходится очень много, но в

CGI.pm есть множество удобных функций, упрощающих набор. Каждая из этих функций возвращает строковое значение, которое вы будете выводить. Например, header () возвращает строковое значение, содержащее строку Content-type с последующей пустой строкой, start_html (строка ) возвращает указанную строку как HTML-титул (название документа), hi (строка) возвращает указанную строку как HTML-заголовок первого уровня, а р (строка) возвращает указанную строку как новый HTML-абзац.

Мы могли бы перечислить все эти функции в списке, прилагаемом к оператору

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

Импортировать все методы обработки аргументов, например

param ().

Импортировать все методы создания заполняемых форм, например

text-field().

Импортировать все методы, которые генерируют стандартные элементы

HTML 2.0.

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

HTML 3.0 (такие как , и ).

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

HTML, характерные для Netscape.

Импортировать все сокращения, генерируемые

HTML (т.е. "html2" + "html3" + "netscape").

Импортировать "стандартные" возможности:

"html2", "form" и "cgi".

Импортировать все имеющиеся методы. Полный список приведен в модуле

CGI.pm, где определяется переменная %tags.

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

: standard. (Подробная информация об импортировании функций и переменных из модулей приведена в главе 7 книги Programming Perl, а также на man-странице Exporter 3).}

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

CGI.pm:

#!/usr/local/bin/perlS -w

# cgi-bin/ice_cream #

программа ответа на форму о любимом сорте мороженого (версия 2) use CGI qw(:standard);

print header() ;

print start_html("Hello World"), hi ("Hello World");

my $favorite = param("flavor");

print p("Your favorite flavor is $favorite.");

print end_html();

Видите, насколько это проще? Вам не нужно беспокоиться о декодировании данных формы, о заголовках и HTML-тексте, если вы этого не хотите.

Генерирование формы

Если вам надоело вводить параметры своей программы в броузер

- создайте заполняемую форму. К таким формам привыкли большинство пользователей. Компоненты формы, которые принимают вводимые пользователем данные, иногда называются vidgets; считается, что этот термин гораздо удобнее, чем "устройства графического ввода". Такие компоненты форм включают одно- и многостроковые текстовые поля, всплывающие меню, прокручиваемые списки, различные виды кнопок и отмечаемых блоков.

Создайте следующую HTML-страницу, которая включает форму с одним компонентом "текстовое поле" и кнопкой передачи. Когда пользователь щелкает на кнопке передачи*, вызывается сценарий

ice_cream, заданный атрибутом ACTION.