Выпуск 33. Ноябрь 2015
← Сравнение веб-клиентов | Содержание | Обзор CPAN за октябрь 2015 г. →Perl 6 для веба
О том, как на Perl 6 уже сегодня поднять простой работающий веб-сервер
Новости
Пара новостей, прежде чем перейти к основной теме.
Во-первых, открылся замечательный сайт perl6intro.com с хорошо структурированным описанием Perl 6. Заодно напомню о существовании репозитория perl6-examples на гитхабе.
Во-вторых, только что вышла новая версия Rakudo: 2015.11.
Чтобы заработали примеры из этой статьи, надо обязательно обновиться, потому что с предыдущей версией ничего работать не будет: можно довести до ума, правя входящие в поставку файлы и обновив вручную пару модулей, но проще взять и поставить 2015.11:
perl Configure.pl --backend=moar --gen-moar
make
make install
Panda
В дистрибутиве Rakudo Star идет довольно большое число модулей и программа для их установки Panda. На сегодня вместо CPAN6 используется понятие «экосистемы», и Panda умеет правильно устанавливать модули, если они были оформлены по соответствующим правилам экосистемы.
После сборки Ракудо исполнимый файл panda
окажется в каталоге install/bin
.
Для установки модуля теперь достаточно выполнить команду panda install Module::X
. Модули, идущие с дистрибутивом, находятся в каталоге install/share/perl6/lib
, а установленные пандой — в install/share/perl6/site
.
HTTP-сервер
В дистрибутиве Ракудо и на сайте modules.perl6.org есть несколько модулей, на основе которых можно построить свой веб-сервер (в том числе с веб-сокетами) или веб-клиент. Интереса заслуживают, прежде всего, HTTP::Easy
, HTTP::Easy::PSGI
, серия модулей Web::App
и фреймворк Crust
. Еще обратите внимание на мини-фреймворк [wee6](https://github.com/vti/wee6)
. Я же сейчас коснусь только фреймворка Bailador
.
Bailador
Это реализация с интерфейсом, максимально приближенным к Dancer
из Perl 5. Даже название такое же — танцор по-испански. Файл с приложением Bailador запускает PSGI-сервер, который сразу готов принимать запросы на дефолтном порту.
Минимальный «Привет, мир!» выглядит так:
use Bailador;
get '/' => sub {
'Hello, world!'
}
baile;
Запуск:
$ perl6 1.pl
Entering the development dance floor: http://0.0.0.0:3000
[2015-11-29T23:26:13Z] Started HTTP server.
Сервер заработал, можно посмотреть, что он отвечает, зайдя по адресу http://0.0.0.0:3000
.
Параметры запросов можно брать сразу из урла:
get '/:name' => sub ($name) {
"Hello, $name!"
}
Обратите внимание, что между sub
и скобкой нужен пробел. Если его не поставить, программа не скомпилируется:
===SORRY!=== Error while compiling /Users/ash/test/perl6/bailador/2.pl
Variable '$name' is not declared
at /Users/ash/test/perl6/bailador/2.pl:3
------> get '/:name' => sub(⏏$name) {
Bailador с удовольствием принимает регулярные выражения:
get / 'square-of/' (<digit>+) / => sub ($n) {
$n * $n
}
Этот блок будет обрабатывать адреса типа http://0.0.0.0:3000/square-of/5
.
Для чтения переменных окружения и параметров GET- или POST-запроса можно обратиться к методу request
:
get '/ua' => sub {
request.env<HTTP_USER_AGENT>
~ '<br />' ~
request.env<QUERY_STRING>
}
Наконец, простейший пример с выдачей результата на основе шаблона:
use Bailador;
get '/form' => sub {
template 'test.tt';
}
baile;
Файл шаблона нужно поместить в подкаталог views
.
Упс, не работает:
Use of uninitialized value $_location of type Any in string context
Any of .^name, .perl, .gist, or .say can stringify undefined things, if needed.
in method template at /Users/ash/perl6/rakudo-star-2015.11/install/share/perl6/lib/Bailador/App.pm:14
Failed to open file /views/t.tt: no such file or directory
Хотя в этом сообщении об ошибке и указан файл, в котором что-то не так, изменить его не так легко. При сборке Ракудо модули дополнительно компилируются в файлы .moarvm
и как-то хитро связываются между собой. Поэтому проще полностью удалить танцорские файлы и каталоги rm -rf install/share/perl6/lib/Bailador*
и установить его заново:
panda install Bailador
После чего исправить ошибку в файле install/share/perl6/site/lib/Bailador/App.pm
:
- my $_location;
+ my $_location = '.';
Теперь запрос http://0.0.0.0:3000/form
выводит содержимое файла views/test.tt
.
Шаблон может принимать хеш с параметрами:
get '/form/:name' => sub ($name) {
template 'name.tt', {name => $name}
}
Сам шаблон:
% my ($params) = @_;
Hi, <%= $params<name> %>!
DBIish
Для работы с базой данных удобно воспользоваться модулем DBIish
, который просто берет и работает (если на компьютере есть libmysqlclient
).
use DBIish;
my $dbh = DBIish.connect(
'mysql',
:host<example.com>,
:port(3306),
:database<dbname>,
:user<username>,
:password<password>
);
my $sth = $dbh.prepare("select now()");
$sth.execute();
my $arr = $sth.fetchall_arrayref();
for $arr -> $x {
say $x;
}
$sth.finish;
$dbh.disconnect;
Логика работы с DBIish
аналогична стандартному DBI
с поправкой на синтаксис Perl 6.
← Сравнение веб-клиентов | Содержание | Обзор CPAN за октябрь 2015 г. →