Доступный Perl (1)

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

Мне интересно выяснить, что должно быть в таком курсе. За основу я беру главы Camel Book.

Глава 1. Обзор Perl
Первый пример здесь — print «Howdy, world!\n»;. Я уже упоминал, насколько противоречивые чувства приходится теперь испытывать с этой фразой, имея 5.10. В Perl 6 это проще (как впрочем и многие другие аспекты).

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

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

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

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

planetperl.ru

Алексей Капранов сообщил о запуске сайта planetperl.ru.

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

Исходные коды сайта опубликованы на гитхабе.

О новом books.perl.org (1)

Хочу поделиться некоторыми мыслями, которые мне хочется воплотить на сайте books.perl.org.

Этот сайт существует много лет, и, прежде всего, пора освежить его внешний вид. Но это одна сторона дела.

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

Третье — разные издания книг плохо связаны друг с другом или вообще отсутствуют.

Четвертое — для тех книг, которые доступны на Google Books, нужно дать возможность посмотреть их там.

Еще очень хочется найти все обложки в хорошем разрешении.

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

Доклады на IPW2009

Организаторы итальянского Perl-воркшопа опубликовали список одобренных заявок на доклады.

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

  • Joel Bernstein. RESTful HTTP responses with Perl (or, how I learned to stop worrying and love RFC2616)‎
  • Emiliano Bruni. Costruzione di una command line in Perl‎
  • Tim Bunce. State-of-the-art Profiling with Devel::NYTProf‎
  • Tim Bunce. DBI oddmenti
  • Maciej Czekay. ‎How to impress your coworkers, or playing Perl in a team‎
  • Mark Keating. ‎What is Enlightened Perl? What is the Enlightened Perl Organisation?‎
  • Flavio Poletti. I Client Web in Perl‎ 
  • oha. ‎Parse::RecDescent per esempi‎
  • Enrico Sorcinelli. pod2.perl.org: the Perl translation documentation project‎
  • Sue Spence. ‎Scalability 101 for Perl Programmers‎
  • Mike Whitaker. Perl and Unicode‎
  • Jonathan Worthington. ‎The Way To Rakudo *‎
  • Jonathan Worthington. ‎Solved In Perl 6‎

Пятый итальянский Perl-воркшоп пройдет 22 и 23 октября в Пизе.

Новые мероприятия в 2009 году

Появилась новая информация о мероприятиях, которые пройдут в текущем году.

С 30 октября по 1 ноября в Рио-де-Жанейро пройдет YAPC::Brasil. Замечательный повод побывать в Бразилии 🙂 Правда, сайт мероприятия — только на португальском языке.

5 декабря в Лондоне состоится очередной лондонский Perl-воркшоп. Традиционно лондонский воркшоп не берет плату за вход, но при этом устраивает вечеринку в пабе.

Напомню также, что 21 ноября в Риге пройдет первый балтийский Perl-воркшоп.

XML и ручной ввод

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

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

Прямолинейное решение — экранировать все угловые скобки, обрамляющие теги, амперсанды и HTML-сущности, а потом обернуть все это в блок CDATA — ненамного лучше полного вырезания тегов, ибо приводит, среди прочего, к тому, что полученный код неудобен для обработки с помощью XSLT. Например, довольно сложно (и даже неоправданно сложно) будет дополнить внешние ссылки классом external:

Читайте об этом на <a href=»http://wikipedia.org/»>Википедии</a>.

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

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

Я использую примерно такой вариант. Полученный от пользователя код встраивается в итоговоый XML-документ так, словно он был написан участниками комитета W3C в редакторе Altova XML Spy:

my $xmlParser = new XML::LibXML();
$xmlParser->expand_entities(0);
my $contentFragment =
    $xmlParser->parse_xml_chunk(make_well_formed_xml($content));
$contentNode->appendChild($contentFragment);

Функция make_well_formed_xml() выполняет несколько последовательных преобразований, включая правку с помощью libtidy и замену сущностей:

sub make_well_formed_xml {
    my $content = shift;
    utf8::decode($content);
    my $tidy = HTML::Tidy->new({
        'output-xhtml' => 1,
        'doctype' => 'omit',
        'show-body-only' => 1,
        'fix-uri' => 1,
    });
    $content = $tidy->clean($content);
    $content =~ s{<}{<!ENTITY lt>}g;
    $content = XML::Entities::decode('all', $content);
    $content =~ s{<!ENTITY lt>}{<}g;
    $content =~ s{&}{&}g;
    return $content;
}

Грязные места в коде — декодирование UTF-8 и замену открывающей угловой скобки — конечно нужно заменить более аккуратным кодом, но поскольку все теперь локализовано в единой функции, это можно отложить на потом, и такой код будет работать годами 🙂

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

Про Perl на разных языках

Габор Сабо создал на вики сайта Perl Foundation страницу International Perl Resources, где попросил сообщество собрать ссылки на материалы про Perl на разных языках.

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

Пополнить коллекцию приглашаются все желающие.

Габор Сабо (Gabor Szabo) — активный участник Perl-сообщества, создатель редактора Padre, организатор нескольких мероприятий в Венгрии и Израиле. В 2009 году получил награду White Camel Award.

libapreq2

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

В основном я использовал самописный парсер HTTP-запроса, который проработал почти без изменений больше пяти лет. Парсер умел разбирать все, в том числе и multipart/form-data, хотя и написан он не слишком высокопарно.

Потом, когда пришел UTF-8, потребовался mod_perl, а самописному парсеру стало все труднее справляться с запросами, я заменил его библиотекой libapreq2. Libapreq — это Apache HTTP Server Request Library. Это модуль, который собирается в отдельную библиотеку и подключается к Апачу:

LoadModule apreq_module modules/mod_apreq2.so

Установка весьма простая, однако следует помнить, что для установки сопутствующих Perl-модулей требуется вызывать не ./configure, a perl Makefile.PL:

perl Makefile.PL --with-apache2-apxs=/path/to/apache2/bin/apxs

В каталоге modules появится соответствующие бинарные библиотеки, а Perl получит модули для работы с ней, в частности, Apache2::Request.

Миграция с CGI или любого другого парсера на libapeq2 проходит гладко, поскольку, собственно, и задачи формулируются весьма просто: получить переменную из запроса или прочитать куку.

my $req = new Apache2::Request($this->{'r'});
$p{$_} = $req->param($_) for $req->param();

Так же просто читать куки и еще более просто получать прикрепленные файлы:

my $upload = $req->upload($param);

Итого: если у вас mod_perl, пользуйтесь libapreq.

Free / gratitudo / libero

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

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

Даккар приводит такие примеры:

VMWare Server è *gratuito*. (VMWare Server бесплатный.)

VirtualBox e qemu sono *liberi*. (VirtualBox и qemu свободные.)

К сожалению, читать итальянскую рассылку mongers@lists.perl.it можно только «вживую», веб-архива у нее нет.

Padre

Вчера вышло очередное обновление написанной на перле интегрированной среды Padre.

Сейчас все работает и под Windows, и под Mac OS. Есть и русский перевод (я его обновлю на днях).

А то, что размер дистрибутива 40 МБ, не должно сильно смущать: в комплекте идут все необходимые компоненты, включая сам Strawberry Perl. Надеюсь, что со временем такого избыточного комплекта не потребуется.