Feb. 24th, 2010

shoorick: (Default)
На перлбурге обслуждали мы с Анатолием [livejournal.com profile] sharifulinым его блиц-доклад про CPAN.
— А что хочешь выложить?
— Да есть у меня модуль для склонения русских имён.
— Так он, поди, у всех есть! :-) Каждый его пишет.
— Пишет, может, и каждый, да не каждый выкладывает.

Мне известен лишь один модуль, который склоняет имена — Lingua::RU::Sklon, но он мне не нравится:

  1. Кодировка модуля — вражеская CP1251 вместо правильной UTF-8.
  2. Идентификаторы образованы от сокр. рус. слов. VIN вместо ACCUSATIVE — неудобно.
  3. За три года модуль так и не ушёл дальше версии 0.01
Поэтому я выложил свой модуль. Теперь в скриптах можно написать так:
#!/usr/bin/perl -wl -CO

use utf8;
use Lingua::RU::Inflect ':all';

my @name = qw/Чайковский Пётр Ильич/;
my @inflected;
$, = ' ';

for ( NOMINATIVE .. PREPOSITIONAL ) {
    @inflected = inflect_given_name( $_, @name );
    push @inflected, shift @inflected;
    print @inflected;
}
Результат:
$ ./test-tchaikovsky.pl
Пётр Ильич Чайковский
Петра Ильича Чайковского
Петру Ильичу Чайковскому
Петра Ильича Чайковского
Петром Ильичом Чайковским
Петре Ильиче Чайковском
Работоспособность протестирована пока что в Mandriva Linux 2010.0, FreeBSD 6.2 и 7.2.

Ближайшие планы:

  1. Разобраться с кириллицей в документации (CPAN считает, что она написана в ISO8859-1, а не в UTF-8);
  2. Написать README, а не оставлять то, что сгенерировано автоматически;
  3. Сделать порт для FreeBSD.
  4. Найти (или организовать) список рассылки / IRC-канал / Jabber-конференцию / форум / вписать желаемое для обсуждения багов;
  5. Ускорить домашнюю связку trac+svn (где сейчас и живёт Lingua::RU::Inflect) либо перенести проект на какой-либо внешний более шустрый хостинг.
Дальние:
  1. Научить модуль склонять любые существительные и прилагательные — в конце концов, имена и фамилии склоняются аналогично: уже сейчас inflect_given_name( DATIVE, qw/Синий чайник/ ) возвращает qw/Синему чайнику/.
  2. Сделать блиц-доклад? :-)
P. S. Да, я знаю, что слово «склонение» переводится как «declension».

shoorick: (Default)
Пытаюсь воткнуть свежезарелизенное в один из наших проектов. С одной стороны, конечно, надо придерживаться правила «Не сломалось — не чини», но, с другой, если модуль выложен на CPAN и, следовательно, уже не сильно связан с исходным проектом — нет смысла держать дубль. Пока натыкаюсь на ошибки:
Malformed UTF-8 character (unexpected continuation byte 0x80, with no preceding start byte) in pattern match (m//) at /usr/local/lib/perl5/site_perl/5.8.9/Lingua/RU/Inflect.pm line 254.
[error] Caught exception in engine "Wide character in memGzip at /usr/local/lib/perl5/site_perl/5.8.9/Catalyst/Plugin/Compress/Gzip.pm line 36"
Попробовал добавить в проблемный участок вызовы функций encode и decode:
my @name = Lingua::RU::Inflect::inflect_given_name(
    GENITIVE,
    decode('utf8', $student->user_id->lname),
    decode('utf8', $student->user_id->fname),
    decode('utf8', $student->user_id->sname),
);

push @name, shift @name; # ФИО → ИОФ
$c->stash->{'student_genitive'} = encode('utf8', join(' ', @name));
Вроде, заработало, но выглядит паршиво.

Надо бы perlunicode перечитать...
shoorick: (Default)
Иногда и просто более внимательное изучение окружающей действительности способно снизить число бессмысленных телодвижений. Вот, скажем, Дмитрий Котеров пишет в своей набле 37 о подготовке модуля к публикации на CPAN, но зачем-то описывает там совершенно ненужный процесс упаковки дистрибутива. Зачем? Есть make dist — он берёт нужные файлы и пакует их в правильно названный архив.

Profile

shoorick: (Default)
shoorick

December 2016

S M T W T F S
    1 23
45678910
11121314151617
18 19 2021222324
25262728293031

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jul. 9th, 2025 12:27 pm
Powered by Dreamwidth Studios