PSGI - Веб-серверный Шлюзовый Интерфейс для Perl (анг. Perl Web Server Gateway Interface Specification)

Интерфейс PSGI содействующий:
  • переносимости веб-приложений
  • сокращению дублирования усилий разработчиков веб-фреймворков.
  • отделению среды веб-сервера от кода веб-фреймворка
Спецификация PSGI определяет стандартный интерфейс между веб-серверами и веб-приложениями или фреймворками на Perl. PSGI не является программным интерфейсом (API) для веб-приложений. Разработчики веб-приложений (конечные пользователи) не будут запускать свои веб-приложения, используя PSGI напрямую - вместо этого предполагается использование фреймворков, поддерживающих PSGI.

Что почитать о PSGI на русском языке:
PSGI - Спецификация Веб-серверного Шлюзового Интерфейса для Perl
PSGI::Extensions - Расширения PSGI
PSGI::FAQ - Часто задаваемые вопросы и ответы

Объявляю благодарность за перевод вышеуказанной документации следующим лицам:

Кстати, Вячеслав прочитает доклад, посвящённый PSGI/Plack, на воркшопе
Black Perl 1-го октября в Крыму: http://black-perl.org/bp2011/

Ссылки:


Mojolicious::Lite -- это микро веб-фреймворк, входящий в состав Mojolicious.

КРАТКИЙ ОБЗОР

    # При загрузке Mojolicious::Lite активируются режимы "strict" и "warnings"
    use Mojolicious::Lite;
     
    # Маршрут с заполнителем
    get '/:foo' => sub {
        my $self = shift;
        my $foo  = $self->param('foo');
        $self->render(text => "Hello from $foo!");
    };
     
    # Запуск системы команд Mojolicious
    app->start;

Hello World!

Минимальное приложение типа "Hello World" выглядит примерно как приведено ниже, при загрузке Mojolicious::Lite автоматически включается действие прагм strict и warnings и портируется несколько функций, превращая сценарий в полнофункциональное веб-приложение.

    #!/usr/bin/env perl
     
    use Mojolicious::Lite;
     
    get '/' => sub { shift->render(text => 'Hello World!') };
     
    app->start;

Вызов app->start, который запускает систему команд Mojolicious, может быть настроен так, чтобы переопределить обычное использование @ARGV.

    app->start('cgi');

Маршруты

Маршруты в основном просто изощренные пути, которые могут содержать различные типы заполнителей. $self является экземпляром Mojolicious::Controller, содержащий HTTP запрос и ответ.

    # /foo
    get '/foo' => sub {
        my $self = shift;
        $self->render(text => 'Hello World!');
    };

Имена маршрутов

У всех маршрутов могут быть ассоциированные с ними имена, это позволяет автоматически определять шаблоны и осуществлять обратную связь с url_for, link_to и form_for. Имена всегда являются последним аргументом, значение * значит, что имя равно маршруту без символов, не являющихся частью слова.

    # /
    get '/' => 'index';
     
    # /hello
    get '/hello' => '*';
     
Всего понемногу

Все эти возможности можно легко использовать вместе.

    # /everything/*?name=*
    get '/everything/:stuff' => [stuff => qr/\d+/] => {stuff => 23} => sub {
        shift->render('welcome');
    };

На сайте Perl5doc.ru в разделе CPAN появился документ Mojolicious::Guides::Rendering, описывающий механизм рендеринга Mojolicious.

Кратко говоря, "рендеринг" - это преобразование данных из одного формата в другой.  В Mojolicious под этим термином подразумевается шаблонизация, генерация кодов состояния http, маршрутизация, работа с данными в формате JSON. Как эти технологии реализованы в Mojolicious, вы узнаете из документа Mojolicious::Guides::Rendering.

Документации Mojolicious на русском языке накопилось достаточно, хотя еще многое предстоит сделать. Стоит отметить всех, кто принял посильное участие в переводе документации Mojolicious:

Mojo::Base: zhdinar
Mojolicious:  zhdinarMinoruvti .
Mojolicious::Guides::Cheatsheet:  vtiДмитрийklik-klik.
Mojolicious::Guides::CodingGuidelines: alexey-rusaleevxomavtiДмитрийFoxcool
Mojolicious::Guides::Cookbook: ДмитрийshoorickHeavyAnykeyFoxcoolzhdinarvti
Mojolicious::Guides::Rendering: xomavtiСергейkorshakДмитрийМаксим Вуецkobanklik-klikdionysDim_K

Надеюсь, число участников будет только увеличиваться :)

Эта статья является урезанной версией оригинального перевода на сайте translated.by.
Оригинальная документация: Mojolicious::Guides::Cookbook.pod.
Данный перевод также внесен в раздел документации фреймворка Mojolicious на сайте perl5doc.ru под названием Mojolicious::Guides::Cookbook


РАЗВЕРТЫВАНИЕ

Запуск Mojolicious и Mojolicious::Lite приложений на различных платформах.

Встроенный сервер

Mojolicious имеет ультрапортативный HTTP 1.1 совместимый web-сервер. Обычно он используются при разработке, но он также достаточно стабильный и быстрый для небольших и средних приложений.

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

Встроенный Prefork Сервер

Чтобы допускать масштабирование с несколькими процессорами (ядрами) и снизить потери производительности из-за блокирующего (медленного) API, встроенный веб-сервер имеет многопроцессовый preforking режим. Это не работает на Windows из-за оптимизаций для UNIX, но это достаточно быстро и масштабируемо для больших приложений.

Nginx

Одним из наиболее популярных способов установки в настоящее время является встроенный preforking web сервер за инвертированным прокси Nginx. Также вожможно использование доменных сокетов UNIX. Встроенный web-сервер Mojolicious, конечно, так же их поддерживает.

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

Apache/CGI

CGI поддерживается «из коробки», и ваше приложение на Mojolicious автоматически определит, что оно запущено как CGI-скрипт.

Apache/FastCGI

FastCGI тоже поддерживается «из коробки», и ваше приложение на Mojolicious автоматически определит, что оно запущено как FastCGI-скрипт.

PSGI/Plack

PSGI - это интерфейс между Perl веб-фреймворками и веб-серверами. Plack - это Perl модуль и набор разработчика, который содержит связующее ПО PSGI, вспомогательные инструменты и адаптеры для веб-серверов. На создание PSGI и Plack вдохновили Python WSGI и Ruby Rack. Приложения Mojolicious смехотворно просто разверачивать с помощью Plack.

Apache/mod_perl (PSGI/Plack)

mod_perl это хороший пример PSGI адаптера без использования plackup, помните что установка переменной окружения PLACK_ENV необходима Mojolicious для автоматического обнаружения PSGI.

IIS6.0/FastCGI

Мы не советуем использовать IIS, ибо это страшно нестабильный веб-сервер. Избегайте работы с ним, если это возможно.

Развлекаемся

Хаки, которые быть может и не очень полезны, но зато интересны! :)

Hello World

Если экономить на каждом байте, то самое маленькое Hello World приложение, написанное на Mojolicious::Lite, имеет следующий вид:

use Mojolicious::Lite;
get '/' => {text => 'Hello World!'};
app->start;

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

Эта статья является составной частью документации веб-фреймворка Mojolicious


НАЗВАНИЕ

Mojolicious::Guides::CodingGuidelines - Руководство по разработке

ОБЗОР

Данный документ описывает рекомендации по написанию программ, лежащие в основе разработки Mojo и Mojolicious.

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

НАЗНАЧЕНИЕ

Mojo это среда исполнения для Perl веб-фреймворков. Она предоставляет все основные инструменты и средства, необходимые для написания как простых веб-приложений, так и веб-фреймворков более высокого уровня, таких как Mojolicious.

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

Специально для новичков в Perl, процесс установки и начала работы с Mojolicious должен быть настолько прост, насколько это возможно. Написание веб-приложений может быть одним из самых забавных способов изучения языка!

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

ПРАВИЛА

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

  • Желательно писать код, не забывая о переходе на Perl6.

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

  • Без теста - функционал ничто!

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

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

  • Желательно любой ценой избегать неодобрения свойств программы.

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

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

  • Добавляйте предварительные требования только если они абсолютно необходимы.

  • Специализированные языки программирования желательно избегать, предпочитая Perl'овые решения.

  • Никакого внутристрочного POD.

  • За документацию отвечает книга, а POD в модуле — всего лишь справочник по API.

  • Строки не должны быть длиннее 78 символов и мы используем отступы в 4 пробела.

  • Код должен быть пропущен через Perl::Tidy с предоставленными настройками в .perltidyrc.

  • Нет спагетти-коду!

  • Код должен быть организован в блоки и эти блоки должны быть прокомментированны.

  • Комментариям желательно быть веселыми, если возможно.

  • Каждый файл должен содержать хотя бы одну цитату из Симпсонов или Футурамы.

  • Никаких имен вне секции CREDITS файла Mojo.pm.

  • Никакого элитизма.

  • Мир!

Copyright (©) 2008-2010, Sebastian Riedel.
Оригинал (английский): Coding Guidelines

Перевод: © alexey-rusaleev, xoma, vti, Дмитрий, Foxcool
Лицензия: The Artistic License 2.0

translated.by переведено толпой

ИМЯ

Mojolicious::Guides::Cheatsheet - Справочное руководство

ОПИСАНИЕ

Этот документ содержит краткое справочное руководство.

ПЕРЕМЕННЫЕ ОКРУЖЕНИЯ

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

MOJO_APP

Определяет какое будет использоваться Mojolicious или Mojo приложение. Должно всегда содержать имя класса наподобие MyApp. Для удобства по умолчанию содержит Mojo::HelloWorld.

MOJO_APP=MyApp

MOJO_CA_FILE

Путь к файлу с TLS CA доверенностями, должен всегда содержать путь в виде /etc/tls/cacarts.pem. Стоить помнить, что для поддержки TLS необходимо установить модуль IO::Socket::SSL.

MOJO_CA_FILE=/etc/tls/cacerts.pem

MOJO_CHUNK_SIZE

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

MOJO_CHUNK_SIZE=1024

MOJO_EPOLL

Принудительное использование epoll в качестве основного цикла для операций ввода-вывода. Стоит помнить, что для поддержки epoll необходимо установить модуль IO::Epoll.

MOJO_EPOLL=1

MOJO_HOME

Домашний каталог Mojolicious приложения, переменная должна всегда содержать путь в виде /home/sri/myapp.

MOJO_HOME=/home/sri/myapp

MOJO_KQUEUE

Принудительное использование kqueue в качестве основного цикла для операций ввода-вывода. Стоит помнить, что для поддержки kqueue необходимо установить модуль IO::KQueue.

MOJO_KQUEUE=1

MOJO_LOG_LEVEL

Данная переменная устанавливает уровень подробности ведения журнала Mojolicious приложением и должна содержать правильный уровень, например debug или error.

MOJO_LOG_LEVEL=debug
MOJO_LOG_LEVEL=error

MOJO_MAX_LINE_SIZE

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

MOJO_MAX_LINE_SIZE=2048

MOJO_MAX_MEMORY_SIZE

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

MOJO_MAX_MEMORY_SIZE=2048

MOJO_MAX_MESSAGE_SIZE

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

MOJO_MAX_MESSAGE_SIZE=1024

MOJO_MODE

Режим запуска Mojolicious приложения, переменная должна содержать правильный режим в виде development или production.

MOJO_MODE=development
MOJO_MODE=production

MOJO_NO_IPV6

Отключение поддержки IPv6 может улучшить производительность и сэкономить память. Для поддержки IPv6 должен быть установлен модуль IO::Socket::INET6.

MOJO_NO_IPV6=1

MOJO_NO_TLS

Отключение поддержки TLS может улучшить производительность и сэкономить память. Для поддержки TLS должен быть установлен модуль IO::Socket::SSL.

MOJO_NO_TLS=1

MOJO_POLL

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

MOJO_POLL=1

MOJO_RELOAD

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

MOJO_RELOAD=1

MOJO_REVERSE_PROXY

Включить поддержку обратного проксирования для Mojolicious приложения.

MOJO_REVERSE_PROXY=1

MOJO_TEMPLATE_CLASS

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

MOJO_TEMPLATE_CLASS=MyApp

MOJO_TMPDIR

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

MOJO_TMPDIR=/tmp/mojo

Copyright (©) 2008-2010, Sebastian Riedel.
Оригинал (английский): Mojolicious Reference

Перевод: © vti, Дмитрий, klik-klik .
translated.by переведено толпой

Статья является частью документации Mojolicious

АТРИБУТЫ

Mojolicious наследует все атрибуты из Mojo и реализует следующие новые.

controller_class

my $class = $mojo->controller_class;
$mojo     = $mojo->controller_class('Mojolicious::Controller');

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

mode

my $mode = $mojo->mode;
$mojo    = $mojo->mode('production');

Режим работы для вашего приложения. По умолчанию используется значение переменной окружения MOJO_MODE или development. Mojo назовёт лог-файл по текущему режиму; если режим отличается от development, логи будут ограничены.

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

sub development_mode {
    my $self = shift;
}

sub production_mode {
    my $self = shift;
}

plugins

my $plugins = $mojo->plugins;
$mojo       = $mojo->plugins(Mojolicious::Plugins->new);

Загрузчик плагина по умолчанию — объект Mojolicious::Plugins. Обычно вы можете оставить всё как есть, см. Mojolicious::Plugin, если хотите написать плагин.

renderer

my $renderer = $mojo->renderer;
$mojo        = $mojo->renderer(MojoX::Renderer->new);

Используется для визуализации контента, по умолчанию MojoX::Render. Два основных плагина визуализации Mojolicious::Plugin::EpRenderer и Mojolicious::Plugin::EplRenderer содержат более подробную информацию.

routes

my $routes = $mojo->routes;
$mojo      = $mojo->routes(MojoX::Dispatcher::Routes->new);

Диспетчер маршрутов, по умолчанию MojoX::Dispatcher::Routes. Вы используете его в стартовом методе для определения конечных точек url (анг. url endpoints) для вашего приложения.

sub startup {
    my $self = shift;

    my $r = $self->routes;
    $r->route('/:controller/:action')->to('test#welcome');
}

secret

my $secret = $mojo->secret;
$mojo      = $mojo->secret('passw0rd');

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

static

my $static = $mojo->static;
$mojo      = $mojo->static(MojoX::Dispatcher::Static->new);

Для обслуживания статических ресурсов из каталога public, по умолчанию MojoX::Dispatcher::Static.

types

my $types = $mojo->types;
$mojo     = $mojo->types(MojoX::Types->new);

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

$mojo->types->type(vti => 'help/vampire');

МЕТОДЫ

Mojolicious наследует все методы от Mojo и реализует следующие новые.

new

my $mojo = Mojolicious->new;

Создаёт новое приложение Mojolicious. Автоматически определяет ваш домашний каталог и устанавливает логирование, основываясь на вашем текущем режиме работы. Кроме того, устанавливается маршрутизация, статическая диспетчеризация и стандартный набор плагинов.

defaults

my $defaults = $mojo->default;
my $foo      = $mojo->defaults('foo');
$mojo        = $mojo->defaults({foo => 'bar'});
$mojo        = $mojo->defaults(foo => 'bar');

Значения по умолчанию для stash. Обратите внимание, что этот метод ЭКСПЕРИМЕНТАЛЬНЫЙ и может быть изменен без предупреждения!

$mojo->defaults->{foo} = 'bar';
my $foo = $mojo->defaults->{foo};
delete $mojo->defaults->{foo};

dispatch

$mojo->dispatch($c);

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

finish

$mojo->finish($c);

Чистка после обработки запроса, как правило, вызывается автоматически.

handler

$tx = $mojo->handler($tx);

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

plugin

$mojo->plugin('something');
$mojo->plugin('something', foo => 23);
$mojo->plugin('something', {foo => 23});

Загрузка плагина.

process

$mojo->process($c);

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

sub process {
    my ($self, $c) = @_;
    $self->dispatch($c);
}

start

Mojolicious->start;
Mojolicious->start('daemon');

Запускает интерфейс командной строки Mojolicious::Commands для вашего приложения

startup

$mojo->startup;

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

sub startup {
    my $self = shift;
}

НАЗВАНИЕ

Mojolicious - Веб в коробке!

СИНОПСИС

# Mojolicious приложение 
package MyApp;

use base 'Mojolicious';

sub startup {
    my $self = shift;

    # Routes
    my $r = $self->routes;

    # Default route
    $r->route('/:controller/:action/:id')->to('foo#welcome');
}

# Mojolicious контроллер 
package MyApp::Foo;

use base 'Mojolicious::Controller';

# Say hello
sub welcome {
    my $self = shift;
    $self->render_text('Hi there!');
}

# Say goodbye from a template (foo/bye.html.ep)
sub bye { shift->render }

ОПИСАНИЕ

Еще в начале дня Интернета была эта прекрасная библиотека Perl называемая CGI, многие люди изучали Perl только из за неё. Она достаточно проста, чтобы начать работу, не зная многого о языке и достаточно мощна, чтобы держать вас в курсе обо всем, что происходит с приложением, обучение на практике было очень увлекательно. Хотя большинство методов, используемых в настоящее время устарело, сама идея остается актуальной. Mojolicious это новая попытка реализации этой идеи c использованием передовых технологий.

Возможности

  • Великолепный MVC веб-фреймворк, позволяющий написать полноценное приложение в одном файле

  • Очень чистый, портативный и объектно-ориентированный чистый Perl API без какой-либо скрытой магии и никаких требований, кроме как поддержка Perl начиная с версии 5.8.7.

  • Полная поддержка HTTP 1.1 и WebSocket клиент/серверая реализация с IPv6, TLS, IDNA, pinelining, распределение памяти и поддержка multipart.

  • Встроенный асинхронный ввод-вывод, prefork-веб с поддержкой epoll и kqueue, "горячая" разработка и использование доменного сокета UNIX (анг. Unix domain socket sharing)

  • Поддержка CGI, FastCGI и PSGI.

  • Свежий код, основанный на многолетнем опыте разработки Catalyst.

  • Мощные возможности из коробки с RESTful роутерами, плагинами, сессиями, signed cookies, сервером статических файлов (static file server), тестированием фреймворка, шаблонизацией в стиле perl, JSON, I18N,

Duct Tape для HTML5 Web

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

use Mojolicious::Lite;

get '/hello' => sub { shift->render(text => 'Hello World!') }

get '/time' => 'clock';

websocket '/echo' => sub {
    my $self = shift;
    $self->receive_message(
        sub {
            my ($self, $message) = @_;
            $self->send_message("echo: $message");
        }
    );
};

get '/title' => sub {
    my $self = shift;
    my $url  = $self->param('url');
    $self->render(text =>
          $self->client->get($url)->success->dom->at('title')->text);
};

post '/:offset' => sub {
    my $self   = shift;
    my $offset = $self->param('offset') || 23;
    $self->render(json => {list => [0 .. $offset]});
};

app->start;
__DATA__

@@ clock.html.ep
% my ($second, $minute, $hour) = (localtime(time))[0, 1, 2];
The time is <%= $hour %>:<%= $minute %>:<%= $second %>.

См. более дружественную к пользователю документацию Mojolicious::Guides и Mojolicious::Lite.

Вот такие пироги (Have Some Cake)

.---------------------------------------------------------------.
|                             Fun!                              |
'---------------------------------------------------------------'
.---------------------------------------------------------------.
|                                                               |
|                .----------------------------------------------'
|                | .--------------------------------------------.
|   Application  | |              Mojolicious::Lite             |
|                | '--------------------------------------------'
|                | .--------------------------------------------.
|                | |                 Mojolicious                |
'----------------' '--------------------------------------------'
.---------------------------------------------------------------.
|                             Mojo                              |
'---------------------------------------------------------------'
.-------. .-----------. .--------. .------------. .-------------.
|  CGI  | |  FastCGI  | |  PSGI  | |  HTTP 1.1  | |  WebSocket  |
'-------' '-----------' '--------' '------------' '-------------'

Хорошим дополнением к документации Mojolicious послужит приведенная ниже презентация:

Сегодня вашему вниманию представлена документация по модулю Lingua::RU::Inflect, позавчера вышел его второй релиз. Здесь есть приятный момент - мне не пришлось его переводить на русский язык, так как к модулю в комплекте прилагается бонус - документация на русском. Это хороший пример, того, как оформлять модули CPAN, представляющие интерес прежде всего для русскоязычного пользователя - на CPAN я пока не встречал других модулей с русскоязычной документацией.

Ниже представлена схема расположения файлов в установочном комплекте:

    |~Lingua-RU-Inflect-0.02/
    | |~lib/
    | | `~Lingua/
    | |   `~RU/
    | |     `-Inflect.pm # <-- Модуль Lingua::RU::Inflect 
    | |~RU/
    | | `~Lingua/
    | |   `~RU/
    | |     `-Inflect.pod # <-- Документация на русском языке 
    | |+t/
    | |-Changes
    | |-Makefile.PL
    | |-MANIFEST
    | |-META.yml
    | `-README

А теперь, собственно, сама документация:

ИМЯ

Lingua::RU::Inflect - Склоняет русские имена

ВЕРСИЯ

Версия 0.02

ОПИСАНИЕ

Lingua::RU::Inflect — модуль perl, предоставляющий ряд функций для русского языка: склонение имён (а также некоторых нарицательных существительных и прилагательных), определение пола по имени, а также выбор правильной формы предлога с беглой гласной в зависимости от следующего за ним слова.

    use Lingua::RU::Inflect;

    my @name = qw/Петрова Любовь Степановна/;

    my $gender = detect_gender_by_given_name(@name);
    # $gender == FEMININE

    my @genitive = inflect_given_name(GENITIVE, @name);
    # $genitive == qw/Петровой Любови Степановны/;

ПЛАНЫ

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

ЭКСПОРТ

Функции detect_gender_by_given_name и detect_gender_by_given_name экспортируются по умолчанию.

Кроме того, можно экспортировать константы с именами падежей:

    use Lingua::RU::Inflect qw/:cases/;

Или функции и константы пола/рода:

    use Lingua::RU::Inflect qw/:subs :genders/;

Или короткие псевдонимы функций

    use Lingua::RU::Inflect qw/:short/;


    use Lingua::RU::Inflect qw/:all/; # или
    use Lingua::RU::Inflect qw/:cases :genders :subs/;

ФУНКЦИИ

detect_gender_by_given_name

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

Возвращает MASCULINE либо FEMININE при успешном определении мужского либо женского пола соответственно или undef при невозможности однозначного определения.

Правила определения

При совпадении с каким-либо правилом оставшиеся правила игнорируются.

  1. Отчество, если указано, позволяет однозначно определить пол: женские отчества заканчиваются на «на», мужские — на «ич» и «ыч».

  2. Большинство русских женских имён оканчивается гласными «а» и «я». Большинство русских мужских имён оканчивается согласной.

    Существуют исключения из обоих правил, женские имена (например, русское имя Любовь, библейские имена Руфь, Рахиль, иностранные имена) могут заканчиваться согласной буквой; мужские имена могут заканчиваться на «а» и «я», особенно это относится к уменьшительно-ласкательным формам имён: Алёша (Алексей), Коля (Николай) и т. д. По некоторым уменьшительно-ласкательным формам имён нельзя установить пол ввиду неоднозначности: так, имя Саша соответствует как мужскому имени Александр, так и женскому Александра; Женя — мужскому Евгений и женскому Евгения. Подобные исключения обрабатываются.

    При получении неопределённого результата функция пытается определить его на следующем шаге.

  3. Большинство русских фамилий образовано от притяжательных слов (включая имена). Женские варианты таких фамилий заканчиваются на «а». Некоторые фамиллии образованы от прилагательных. Женские варианты таких фамилий заканчиваются на «я».

_inflect_given_name

Склоняет фамилию, имя, отчество. Принимает до 5 аргументов — пол, падеж, фамилия, имя, отчество (фамилия, имя, отчество должны быть в именительном падеже).

Возвращает список — фамилию, имя, отчество в заданном падеже.

inflect_given_name

Определяет пол по имени и склоняет это имя.

Принимает до 5 аргументов — падеж, фамилия, имя, отчество (фамилия, имя, отчество должны быть в именительном падеже).

Падеж может быть представлен константой, доступны имена: NOMINATIVE , GENITIVE , DATIVE , ACCUSATIVE , INSTRUMENTAL , PREPOSITIONAL для именительного, родительного, дательного, винительного, творительного и предложного падежей соответственно.

Возвращает список — фамилию, имя, отчество в заданном падеже.

choose_preposition_by_next_word

Выбирает предлог с беглой гласной (например, о/об/обо) по следующему за ним слову.

Принимает 2 аргумента: предлог и следующее_слово. В качестве предлога выступает строка с наиболее коротким из возможных значений. Допустимые предлоги: 'в' , 'из' , 'к' , 'над' , 'о' , 'от' , 'пред' , 'перед' , 'под' и 'с' .

Для вызова функции с допустимыми предлогами задан ряд псевдонимов. Имена псевдонимов образованы от полных вариантов (чтобы избежать использования однобуквенных идентификаторов) за исключением ob :

izo

izo — псевдоним для choose_preposition_by_next_word 'из',

ko

ko — псевдоним для choose_preposition_by_next_word 'к',

nado

nado — псевдоним для choose_preposition_by_next_word 'над',

ob

ob — псевдоним для choose_preposition_by_next_word 'о',

oto

oto — псевдоним для choose_preposition_by_next_word 'от',

podo

podo — псевдоним для choose_preposition_by_next_word 'под',

predo

predo — псевдоним для choose_preposition_by_next_word 'пред',

peredo

peredo — псевдоним для choose_preposition_by_next_word 'перед',

so

so — псевдоним для choose_preposition_by_next_word 'с',

vo

vo — псевдоним для choose_preposition_by_next_word 'в',

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

Пример использования псевдонимов:

    use Lingua::RU::Inflect qw/:short/;

    map {
        print ob, $_;
    } qw(
        арбузе баране всём Елене ёлке игле йоде
        мне многом огне паре ухе юге яблоке
    );

    map {
        print so, $_;
    } qw(
        огнём водой
        зарёй зноем зрением зябликом
        садом светом слоном спичками ссылкой
        Стёпой стаканом сухарём сэром топором
        жарой жбаном жратвой жуком
        шаром шкафом шлангом шубой
    );

НЕПОЛАДКИ

Пожалуйста, присылайте сообщения о найденных неполадках и желаемых возможностях на bug-lingua-ru-inflect at rt.cpan.org , или через веб-интерфейс на http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Lingua-RU-Inflect. Меня известят, и вы будете автоматически оповещены при устранении найденных вами неполадок.

ПОДДЕРЖКА

Вы можете найти документацию к этому модулю с помошью команды perldoc.

    perldoc Lingua::RU::Inflect

Кроме того, вы можете найти информацию в других местах:

СМ. ТАКЖЕ

http://www.imena.org/declension.html

АВТОР

Александр Сапожников http://shoorick.ru/

ЛИЦЕНЗИЯ

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

Mojo::Base
категория: Mojolicious

Название

Mojo::Base - Минимальный класс для проектов Mojo(Mojolicious)

Синопсис

    package Car;
    use base 'Mojo::Base';
     
    # создание метода 'driver' в пакете Car
    __PACKAGE__->attr('driver');

    # создание метода 'doors' в пакете Car
    # который должен возвращать значение '2' 
    __PACKAGE__->attr('doors' => 2);

    # создание методов 'passengers' и 'seats' в пакете Car
    # каждый из них представляет собой подпрограмму sub { 2 }
    __PACKAGE__->attr([qw/passengers seats/] => sub { 2 });

    package main;

    my $bmw = Car->new;

    # метод doors возвращает неопределенное значение
    print $bmw->doors;

    # метод doors() присваивает значение '5', которое он затем
    # возвратит в последующем обращении к нему 
    #
    print $bmw->doors(5)->doors;
    
    # создание метода 'driver' в пакете Car
    # который должен возвращать значение 'Sebastian' 
    my $mercedes = Car->new(driver => 'Sebastian');
   
    # метод passengers содержит значение '2'
    # которое замещается значением '7'
    print $mercedes->passengers(7)->passengers;

Описание

Mojo::Base - предоставляет простой способ создания новых методов класса.

Методы

new

new - основной конструктор объектов Mojo.

  • NamePackage->new()

    Если констуктору new не переданы параметры, методы объекта будут возвращать значения по умолчанию.

  • NamePackage->new('name_method' => 'value')
  • NamePackage->new({ 'name_method' => 'value' })

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

    package Car;
    use base 'Mojo::Base';

    __PACKAGE__->attr( driver => 'Вася' );

    package main;
    
    # создаем объект
    my $bmw = Car->new;

    # метод driver возвращает Васю 
    print $bmv->driver, "\n";
    
    # создаем объект и замещаем значение по умолчанию 
    # возвращаемое методом driver
    my $bmv = Car->new(driver => 'Петя');

    # метод driver возвращает Петю 
    print $bmv->driver, "\n";

attr

Конструктор attr создает в текущем пакете новые методы.

    package Car;
    use base 'Mojo::Base';

    __PACKAGE__->attr('name');
    __PACKAGE__->attr([qw/name1 name2 name3/]);
    __PACKAGE__->attr(name => 'foo');
    __PACKAGE__->attr(name => sub { ... });
    __PACKAGE__->attr([qw/name1 name2 name3/] => 'foo');
    __PACKAGE__->attr([qw/name1 name2 name3/] => sub { ... });
  • __PACKAGE__->attr('name')
  • __PACKAGE__->attr('name' => 'value')

    Создается метод name. Cтрока name должна соответствовать шаблону /^[a-zA-Z_]\w*$/ . Второй необязательный параметр value - атрибут метода.

  • __PACKAGE__->attr([qw/name1 name2 name3/])
  • __PACKAGE__->attr([qw/name1 name2 name3/] => 'value')
  • __PACKAGE__->attr([qw/name1 name2 name3/] => sub{ ... })

    Каждый из элементов [qw/name1 name2 name3/] - имя метода который нужно создать.

    Второй необязательный параметр - значение 'value' - будет возвращаться при вызове метода либо ссылка на подпрограмму sub{ ... } - будет выполняется при вызове указанного в первом параметре метода.

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

Mojolicious, Mojolicious::Book, http://mojolicious.org.

Statistic