вторник, 16 марта 2010 г.

Обновил Debug::LTrace до 0.02

* Обновилась документации и тесты.
* Теперь модуль без проблем инсталлируется под 5.8.x

ЗЫ: Как приятно смотреть на все эти зелененькие "PASS" в CPAN Testers Report :))

воскресенье, 14 марта 2010 г.

Не только одними feature5.10... :)



Выложил свой модуль на CPAN  и тут начались проблемы - CPAN Testers показывает, что во всех версиях перла ниже 5.10 тесты проваливаются, начал разбираться и вот:

в 5.10.x


print qr{\Q\_\E} #выведет:(?-xism:\\_)
print "\Q\_\E"   #выведет:_


в 5.8.x

print qr{\Q\_\E} #выведет: 
(?-xism:_)


print "\Q\_\E"   #выведет: 
_


Занятно, однако ...

четверг, 11 марта 2010 г.

koorchik's Perl blog переехал с koorchik.name на koorchik.blogspot.com

Блог изначально создавался как просто страница с советами по Perl ("Perl Tips"), но в результате вырос и потребовался новый функционал, появились желающие прокомментировать посты...

Теперь koorchik's Perl blog можно найти по адресу http://koorchik.blogspot.com/ и все желающие могут оставлять комментарии. Если у кого-то возникало желание прокомментировать старый пост, то теперь можно это сделать, поскольку весь контент был полностью перенесен.

Как добавить свою аватарку на CPAN

Залил свой модуль Debug::LTrace на CPAN и смотрю у меня дефолтовая аватарка.
Начал перерывать все пункты в меню моего аккаунта на PAUSE сервере в поисках формы аплоада аватарок и все тщетно. Через 15 минут меня совсем перестал удивлять тот факт, что так мало автором на CPAN имеют свои аватарки :)).

Так вот. Решил я посмотреть в html коде откуда подгружается аватарка на CPAN и... возможно это для меня только было новоcтью :)... но это gravatar.com.

В общем решение следующее: если у меня в PAUSE юзер называется koorchik, то просто регистрирую на gravatar.com аккаунт по емейлу koorchik@cpan.org и добавляю туда свою аватарку. И все! После этого CPAN сам подхватит ее.

среда, 10 марта 2010 г.

Debug::LTrace - мой дебют на CPAN

Debug::LTrace отслеживает вызов и возврат функций. Использование Debug::LTrace не требует никаких дополнительных изменений в коде. Информации о вызовах выводится через стандартный warn.

На CPAN есть и другие модули такие, как Devel::TraceCalls и Debug::Trace, но Devel::TraceCalls неудобный в использовании(хотя очень мощный), Debug::Trace - удобный и простой, но не хватает функционала.

Debug::LTrace за основу взял удобное API Debug::Trace, но дополнительно поддерживает:

  • Лексически ограниченный трейсинг(трейсит пока существует объект-трейсер)
  • Стандартная функция caller отрабатывает нормально
  • Трейсинг целых модулей (используя '*' для обозначения всех функций в модуле)
  • Улучшенный вывод информации (дерево вложеностей)
  • Больше отладочной информации (время выполнения, контекст вызова...)
Модуль можно посмотреть http://search.cpan.org/~koorchik/Debug-LTrace-0.01/lib/Debug/LTrace.pm

Пример вывода: 
TRACE C: /-FOO::out_outer() called at example.pl line 15 package FOO
TRACE C: | /-FOO::outer(2,{'aaa' => {'yyy' => 'ARRAY(0x7fe610)','qqq' => 'www'}}) called at example.pl line 49 sub FOO::out_outer
TRACE C: | | /-FOO::inner(3) called at example.pl line 32 sub FOO::outer
TRACE C: | | | /-FOO::Dumper(3) called at example.pl line 39 sub FOO::inner
TRACE R: | | | \_FOO::Dumper(3) [VOID] in 3.5e-05 sec
TRACE C: | | | /-FOO::inner2(3) called at example.pl line 40 sub FOO::inner
TRACE R: | | | \_FOO::inner2(3) [VOID] in 1.4e-05 sec
TRACE R: | | \_FOO::inner(3) [VOID] in 0.000213 sec
TRACE C: | | /-FOO::inner2(4) called at example.pl line 33 sub FOO::outer
TRACE R: | | \_FOO::inner2(4) [VOID] in 1.5e-05 sec
TRACE R: | \_FOO::outer(2,{'aaa' => {'yyy' => 'ARRAY(0x7fe610)','qqq' => 'www'}}) [VOID] in 0.000417 sec
TRACE C: | /-FOO::inner(111) called at example.pl line 50 sub FOO::out_outer
TRACE C: | | /-FOO::Dumper(111) called at example.pl line 39 sub FOO::inner
TRACE R: | | \_FOO::Dumper(111) [VOID] in 3.5e-05 sec
TRACE C: | | /-FOO::inner2(111) called at example.pl line 40 sub FOO::inner
TRACE R: | | \_FOO::inner2(111) returned: (112) in 4.4e-05 sec
TRACE R: | \_FOO::inner(111) returned: (112) in 0.000276 sec
TRACE R: \_FOO::out_outer() [VOID] in 0.00088 sec
TRACE C: /-FOO::recurse(1) called at example.pl line 25 package FOO
TRACE C: | /-FOO::recurse(2) called at example.pl line 58 sub FOO::recurse
TRACE C: | | /-FOO::recurse(3) called at example.pl line 58 sub FOO::recurse
TRACE C: | | | /-FOO::recurse(4) called at example.pl line 58 sub FOO::recurse
TRACE C: | | | | /-FOO::recurse(5) called at example.pl line 58 sub FOO::recurse
TRACE R: | | | | \_FOO::recurse(5) returned: (6) in 4.8e-05 sec
TRACE R: | | | \_FOO::recurse(4) returned: (6) in 0.000177 sec
TRACE R: | | \_FOO::recurse(3) returned: (6) in 0.00032 sec
TRACE R: | \_FOO::recurse(2) returned: (6) in 0.00044 sec
TRACE R: \_FOO::recurse(1) returned: (6) in 0.000562 sec
TRACE C: /-BAR::Dumper([1]) called at example.pl line 70 package BAR
TRACE R: \_BAR::Dumper([1]) [VOID] in 3.8e-05 sec

воскресенье, 7 февраля 2010 г.

Таблицы псевдографикой


Задача отправлять табличную информацию на почту.  И решение в общем то очевидное - использовать псевдографику(хотя возможно кого-то устроит html), либо просто выравнивать текст при помощи printf, но эффект уже не тот :).  Полчаса моего поиска в CPAN увенчались успехом и был найдет модуль Text::SimpleTable, который был предельно простым и полностью решал поставленную задачу. 

Пример:
use Text::SimpleTable;
my $t = Text::SimpleTable->new([5, 'Foo'], [10, 'Bar']);
$t->row('foobarbaz', 'yadayadayada');
$t->hr;
$t->row('barbarbarbarbar', 'yada');
print $t->draw;


.-------+------------.
| Foo   | Bar        |
+-------+------------+
| foob- | yadayaday- |
| arbaz | ada        |
+-------+------------+
| barb- | yada       |
| arba- |            |
| rbar- |            |
| bar   |            |
'-------+------------'

четверг, 4 февраля 2010 г.

GUI в Perl: Frozen Bubble

Есть игрушка, которая мне очень нравится - FrozenBubble  и я давно в нее играюсь.  И я был приятно удивлен когда узнал, что она написана на Perl и SDL :)
Красочная игра, 100 уровней для одного игрока, есть поддержка сетевой игры, классный саундтрек.  Показательный пример создания качественной игры на Perl.