Последнее в категории CPAN

Моноджейсон

| 1 комментарий

Ох, моноглоты.

Печатаем содержимое хеша, видим буквы:

for (keys %hotel) {
    say $hotel{$_}{name};
}

Александр Хаус Бутик-Отель
Отель Мэрибель
Отель Звездный
Гостиница Южная
Гостиница Октябрьская

Берем модуль JSON, делаем семь шагов дао по инструкции, получаем фигу:

say JSON->new->utf8->encode({
    availability => \@availability,
    hotels       => \%hotel,
});

... "name":"Бутик-Отель РахманиР... 
"name":"Отель Амулет на Большом проспР...
"name":"Мини-Отель Золотой ЛР...

Git::Repository

| 1 комментарий

На спане есть модуль Филипа BooK Брухата для работы с репозиторием гита из программы на перле — Git::Repository.

Модуль предоставляет простой интерфейс для работы с гитом:

use Git::Repository;

my $repo = new Git::Repository(work_tree => '../myproj');
my @log = $repo->run(log => '-v');

Хотя необходимости знать команды и ключи гита при работе с Git::Repository не избежать, наверняка использование модуля окажется несколько более удобным, чем «ручное» создание в программе строки шела и исполнение ее в обратных кавычках.

Пара ссылок

| Нет комментариев

На perlcast.com — интервью со Стеваном Литтлом, создателем Moose.

На спане — модуль для Perl-гольфистов Acme::Minify.

В очередной раз подумалось, что код из блока SYNOPSIS POD-документации модулей на спане нужно автоматически включать в набор тестов.

Вот модуль Time::Business, судя по описанию, полезный: умеет переводить рабочие часы в «общечеловеческие». CPAN сообщает о десятках успешных тестов на разных платформах. Но в действительности к модулю прилагается только тест use_ok (это не самое страшное), а код из краткого описания не работает:

use v5.12;
use Time::Business;

my $bt = new Time::Business ({
    WORKDAYS => [1..5],
    STARTTIME => 1000,
    ENDTIME => 1900,
});
my $seconds = $bt->calctime(time, time + 1 * 86400);

perl test.pl
Can't locate object method "calctime" via package "Time::Business" at test.pl line 9.

Понятно, что дальнейшее чтение документации помогает добиться работоспособности, но внутренний голос сразу начинает говорить о том, что как-то и все остальное некрасиво: и странный формат записи времени (а что, если записать 0800 — не в восьмеричном ли формате это получится?), и капслок в именах ключей, и отсутствие предопределенных значений — собственно, все то, что замечаешь при первом взгляде, но что лишь усиливает негатив после того, как первый тест не заработал.

Для этого фокуса потребуется взять один Class::Accessor и один Test::Deep, замешав их в одном модуле:

package MyTest;

use base 'Class::Accessor';
use Test::Deep;

__PACKAGE__->mk_accessors qw(mytest);

1;

Модуль Class::Accessor создаст в пакете MyTest метод mytest(), который должен работать как пара сеттер — геттер для установки поля mytest (точнее, $self->{mytest}). Тестируем:

use v5.12;
use MyTest;

my $test = new MyTest;
$test->mytest('test');
say "mytest=", $test->mytest;

И видим, что никакое значение mytest=test не устанавливается. Комментируем в файле MyTest.pm строку, подключающую модуль Test::Deep, и все работает:

mytest=test

Раскомментируем обратно и попробуем немного по-другому:

$test->set('key', 'value');
set $test('key', 'value');

Опять не работает. Но по-другому мы пробуем уже после того, как заглянули в исходник Test::Deep и увидели там безусловный экспорт функции set:

@EXPORT = qw( eq_deeply cmp_deeply cmp_set cmp_bag cmp_methods
    useclass noclass set bag subbagof superbagof subsetof
    supersetof superhashof subhashof
);

В свою очередь, внутри методов-аккессоров, которые создает Class::Accessor, используются вызовы $self->set(...), которые в модуле, унаследованном от него, попадают напрямую в Test::Deep::set().

Неуклюжее быстрое решение: подсказать компилятору, куда направлять внутренние вызовы методов set:

package MyTest;

use base 'Class::Accessor';
use Test::Deep;

*set = *Class::Accessor::set;

__PACKAGE__->mk_accessors qw(mytest);

1;

Про XXX

| Комментариев: 2

На спане есть модуль Инги дёт Нета (Брайана Ингерсона) под названием XXX, предназначенный для — ха! — для отладки.

Модуль экспортирует несколько функций WWW, XXX, YYY и ZZZ, которые печатают дамп того, что находится справа. То есть достаточно вписать в нужное место XXX, и выполнение программы прекратится отладочным сообщением:

use v5.12;
use XXX;

XXX my @digits = 'a'..'f';

--- a
--- b
--- c
--- d
--- e
--- f
...
  at 1.pl line 4

По умолчанию дамп делается в формате YAML, но это возможно переопределить, например:

use v5.12;
use XXX -with => 'Data::Dumper';

XXX my $person = {sex => 'male', age => 30};

$VAR1 = {
  'age' => 30,
  'sex' => 'male'
};

  at 2.pl line 4

Вызов XXX приводит к завершению программы (die), а WWW печатает предупреждение (warn).

Несмотря на то, что все равно приходится явно подключать модуль (use XXX), подход очень интересный: написать в начале (или любой другой части — функция возвращает все свои аргументы) строки три буквы (хотя еще удобнее было бы, если бы названия функция были в нижнем регистре) намного проще и быстрее, чем, например, say Data::Dumper($var).

Йозеф Кутей обновил дистрибутив Universe::Galaxy, который содержит модуль с бесконечным названием Universe::ObservableUniverse::Filament::SuperCluster::Cluster:: Group::Galaxy::Arm::Bubble::InterstellarCloud::SolarSystem::Earth.

Из двух доступных методов нам важен ultimate_answer, который дает ответ на главный вопрос жизни, вселенной и всего такого.

use v5.10;

Universe::ObservableUniverse::Filament::SuperCluster::⏎
Cluster::Group::Galaxy::Arm::Bubble::InterstellarCloud::⏎
SolarSystem::Earth;

say Universe::ObservableUniverse::Filament::SuperCluster::⏎
Cluster::Group::Galaxy::Arm::Bubble::InterstellarCloud::⏎
SolarSystem::Earth->ultimate_answer;

42

А еще на спане есть модуль Acme::Test::42, который работает аналогично любому другому современному модулю, основанном на Test::Builder, но проверяет, вычислен ли ответ на главный вопрос.

Соответственно, тестируем:

use Universe::ObservableUniverse::Filament::SuperCluster::⏎
Cluster::Group::Galaxy::Arm::Bubble::InterstellarCloud::⏎
SolarSystem::Earth;

use Acme::Test::42 qw(no_plan);

ok(Universe::ObservableUniverse::Filament::SuperCluster::⏎
Cluster::Group::Galaxy::Arm::Bubble::InterstellarCloud::⏎
SolarSystem::Earth->ultimate_answer);

ok 1
1..1

 

Сегодня на DevConf::Perl рассказал про то, как авторы модулей CPAN используют новые возможности, доступные в Perl 5.10, и о том, что нового появилось в 5.12. Кстати, как раз сегодня появился релиз Perl 5.12.1.

Идея собрать примеры использования со спана появилась спонтанно перед поездкой на Perlburg в начале этого года (хотя вначале я хотел всего лишь обновить свои прошлогодние «Фичи Perl 5.10 на практике», показав новые примеры своего кода).

Начиная с февраля я рассказал про Perl 5.10 на спане три раза, и, хотя каждый раз появлялось что-то новое (и почти полностью менялась аудитория), я немного устал от этого набора слайдов. Теперь хочу подготовить большой обзор существующего сегодня кода на Perl 6. Премьера 26 июня в Брюсселе.

Про Moose

| 1 комментарий

Из ментальных записок системного администратора.

Так, а что это записи в Твиттере давно не обновлялись? Ага, в кроне скрипт не закомментирован. Запускаю вручную.

Хопа! Обновился до 5.12, а Class::MOP не поставил. (Кстати, всегда считал, что P — это programming, а недавно узнал, что это protocol.)

# cpan Class::MOP

...won't install without force.

Хоп, это модный модерновый модуль-то не ставится на автомате? А, там Devel::GlobalDestruction не прошел тесты и все разрушил. Ну так и название — Глобальное Разрушение.

# cpan
cpan> look Devel::GlobalDestruction
# perl Makefile.PL

Поставили. Встал и Class::MOP. Запускаю. Хоп!

...get_meta_method_name not found.

Чо? Я должен пройти курс мета-программирования? Да мне надо всего лишь фигачить посты в Твиттер, там и буков-то не хватит для таких названий гета-мета-хуета-эйяфьятлайокудль. Кстати, Твиттер был бы другим, если бы его придумали исландцы.

Ну ладно, обновлю и Лосика.

# cpan Moose

О, сам установился. Ну все, победа, первомай.

Опа, а надо было же запустить скрипт из крона (за всем этим модернизмом и забыл).

Can't locate Variable/Magic.pm in @INС

Ну ё, опять просят магию. Что там, поставим.

Тут где-то была хорошая цитата про Муз в рассылке.

use Perl^WMoose^WMozg or die;

Музмаздай, что ли.

  • Брайн ди фой пишет новую редакцию книги Effective Perl Programming.
  • С новым маком и Mac OS X 10.6 в комплекте идет Perl 5.10.0.
  • Алекс Капранов анонсировал CPAN Hubble — одновременный поиск по CPAN и GitHub.

Страницы

  • img

Об архиве

Эта страница содержит последние записи категории CPAN.

Следующая категория — Администрирование.

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