Среда, 10-е марта

i-t-шные заметки: WTF

Оператор <> в перле имеет замечательную особенность: затирать глобальную переменную $_. В некоторых случаях это ведет к труднонаходимым багам. Простой пример (с фатальной ошибкой):

1  my %val = map { $_ => read_val($_) } (1,2,3);
2
3  sub read_val {
4      open my $fh, '<', 'myfile' or die $!;
5      while (<$fh>) {
6          if ($. == $_[0]) {
7              return $_
8          }
9      }
10 }

Modification of a read-only value attempted at test.pl line 5.
 

Вторник, 9-е марта

koorchik's Perl blog: 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

Сообщество ru_catalyst в LiveJournal: проблема с uri_for и utf8 - РЕШЕНА!

5.80021 2010-03-03 23:02:01 - в этой версии сделаны нужные правки. uri_for нормально понимает unicode! Всем апгрейдиться!)

Catalyst Web Framework: проблема с uri_for и utf8 - РЕШЕНА!

5.80021 2010-03-03 23:02:01 - в этой версии сделаны нужные правки. uri_for нормально понимает unicode! Всем апгрейдиться!)

http://juick.com/vti/587915

Русскоязычные студенты, изучающие и любящие Perl, присоединяйтесь к GSOC2010! Уже есть три пректа на Mojolicious perlfoundation.org

http://juick.com/vti/587009

Проекты GSOC2010 perlfoundation.org

XPoint.ru | Программирование::Perl::Модули: Динамический вызов модуля

Проблема состоит в том, что надо вызывать модуль iw.pm, и передавать параметер для динамического подключения иного (пример test.pm, но этим не ограничивается). Все это для того, чтобы для каждый template создавать модуль который на выходе будет иметь несколько одноименных методов. Вызов происходит с test.pl Знаю, что данная проблема решаетсяю. Читал несколько лет назад, но никогда не использовал и к сожалению не помню где это было. Если бы вспомнить правльный термин к данному методу, то можно было бы найти пример. Приведенный код не работает - выдает Can't locate template::test in @INC Буду признателен за любую полезный совет. iw.pm package template::iw; use strict; use warnings; sub new { my $that = shift; my $class = ref(shift) || $that; my $self = { "o" => undef }; bless $self, $class; return $self; } sub init { my ($self, $inp) = @_; if (defined $inp) { my $temp = qw(template::).$inp; require $temp; $self->{"o"} = $temp->new(); } return $self->{"o"}; } 1; test.pm package template::test; use strict; use warnings; sub new { my $class = shift; my $self = { "x" => undef }; bless ($self, $class); return $self; } sub x { my ($self, $inp) = @_; $self->{"x"} = $inp if defined ($inp); return $self->{"x"}; } 1; test.pl use template::iw; my $iw = template::iw->new(); my $test = $iw->init(qw~test~); print $test->x("alex");

Blog.Perl5doc.ru: perl5100delta (3) - История и развитие Perl

Частичный перевод документа perl5100delta.

readdir() в системе Windows

Функция readdir() может возвращать "короткое имя" когда полное имя содержит символы, не принадлежащие кодовой таблице ANSI (ANSI codepage). Аналогично Cwd::cwd() может возвращать короткое имя директории, а glob() может возвращать короткие имена файлов и директорий. В файловой системе NTFS эти короткие имена всегда могут быть представлены в кодовой таблице ANSI. Это не будет верно для всех остальных драйверов файловых систем (file system drivers); например файловая система FAT хранит короткие имена в кодовой таблице OEM, так некоторые файлы на томах FAT остаются недоступными через ANSI API.

Кроме того, $^X, @INC, и $ENV{PATH} обрабатываются препроцессором при запуске, чтобы проверить все пути на валидность в кодовой таблице ANSI (если это возможно)

Функция Win32::GetLongPathName() теперь возвращает UTF-8 закодированное корректное имя файла вместо использования замены символов для того, чтобы подогнать имя к кодовой таблице ANSI. Новая функция Win32::GetLongPathName() может быть использована для преобразования полного имени файла в короткое, только если полное имя не пожет быть представлено в кодовой таблице ANSI.

Многие другие функции в модуле Win32 были усовершенствованы для обработки UTF-8 закодированных аргументов. Более подробно об этом в Win32.

Переопределение readpipe()

Встроенная функция readpipe() теперь может быть переопределена. Это позволяет переопределить ее аналог - оператор qx// (также известный, как оператор `` ). Кроме того, теперь по умолчанию исползуется $_ , если не предоставлено никаких аргументов.(Rafael Garcia-Suarez)

Аргумент по умолчанию для readline()

Теперь readline() по умолчанию использует *ARGV если ему не перадано аргументов. (Rafael Garcia-Suarez)

Переменные класса 'state'

Введен новый класс переменных. Переменные состояния (state variables) подобны лексическим переменным, но декларированные ключевым словом state вместо my. Они видны только в своей лексической области, но их значения стойкие: в отличие от лексических переменных, они не становятся неопределенными при выходе из их области видимости, но сохраняют свое прежнее значение. (Rafael Garcia-Suarez, Nicholas Clark)

Для использования 'state' переменных, нужно предварительно объявить:

    use feature 'state';

или используя ключ командной строки -E .

Операторы тестирования стека

В качестве новой формы синтаксического сахара теперь доступны операторы тестирования стека. Вы можете теперь писать f -w -x $file в ряд, что тоже самое -x $file && -w _ && -f _ . Подробнее в "-X" in perlfunc

Понедельник, 8-е марта

http://juick.com/mvuets/586161

Is Perl dead? --- isperldead.com

Сообщество ru_perl в LiveJournal: Timeouts in Multi-Threads

Здравствуйте,

Пытаюсь реализовать тайм-ауты в нитях (чтобы нить умирала/получала сигнал по истечению времени), думал сделать это через alarm(), но благодаря тому что:
Only one timer may be counting at once. Each call disables the previous timer, and an argument of 0 may be supplied to cancel the previous timer without starting a new one. (perldoc)
соотв это работает в форке, но не в нитях. Способов легально получить время выполнения нити (не засекая), чтобы отслеживать их в главной, также не нашел.
Какие существуют наиболее изящные решения этой проблемы?

Заранее благодарен за любую помощь.

P.S. Если что, про non blocking sockets я вкурсе.

Воскресенье, 7-е марта

Сообщество ru_perl в LiveJournal: вопрос по mod_perl

Такой вопрос, если нужно получить request, ответить клиенту, но остаться в обработчике и делать что-то дальше (например, послать человека на другой сайт, но еще что-то делать, но чтоб клиент не ждал, а сразу перешел куда надо). Есть такая возможность в mod_perl? или запрос отправляется только после return ?

Суббота, 6-е марта

On Perl — блог о языке программирования Perl и его сообществе: Bus number и пр.

Да здравствует перл! Этот блог работает на перле, но писали его неизвестные мне люди Я тут зашел куда-то в админской части, и увидел массу комментариев, которые, оказывается, висят неодобренными. :-O 

Часть я пооткрывал, а часть (ай!) удалил. Перл + юзабилити часто так же несовместимо, как и многие другие продукты, созданный программистами.

И еще я забыл с собой зарядное устройство от телефона.

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

Пятница, 5-е марта

On Perl — блог о языке программирования Perl и его сообществе: Голландский Perl-воркшоп 2010 года

Только что вернулся в гостиницу с седьмого голландского Perl-воркшопа. Он проходил в хостеле Stayok в городе Арнеме.

Это город в ста километрах от Амстердама, в часе езды электричкой (и еще полчаса от вокзала, то есть почти что московские расстояния от спальных районов до центра :-)

Как всегда, я сразу обращаю внимание на посещаемость, и даже под вечер она была около 90 % — из 39 зарегистрированных посетителей я насчитал 35.

Часть выступлений была на голланском языке (он напоминает смесь немецкого и английского с примесью французской картавости), поэтому все остальные, которые на английском, сразу стали вдвое интереснее :-)

Особенно хорош был Мартин Берендз, сделавший обзор интерпретаторов и компиляторов Perl 6, существующих в марте 2010 года. Мартин упомянул неофициальное понятие bus number, которое равно числу ведущих разработчиков проекта.

Леон Тиммерманс подкинул еще одну лингвошутку — unintentional feature (имеется в виду баг).

Через какое-то время должны появиться видеозаписи (их делали местные организаторы).

А после обеда сначала пошел мокрый снег, а потом — к вечеру — дождь; электричку пришлось ждать полчаса; и я теперь весь промокшый, но довольный :-)

Сообщество ru_perl в LiveJournal: Вакансия младшего Perl-разработчика (Москва, м. Дмитровская)

Рассматриваем молодых специалистов с опытом разработки на Perl (участие хотя бы в одном проекте), знанием SQL.
Приветствуется опыт разработки по UNIX, опыт использования в работе CVS, SVN, знание Apache HTTP Server.

Условия:
* Полная занятость.
* График работы относительно гибкий (при необходимости возможно совмещать с учебой на старших курсах).
Заработная плата: 45 - 50 тыс. р. в месяц, по результату собеседования. Перспективы роста.
Офис в 5-ти минутах хотьбы от ст. м Дмитровская.

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

Резюме и вопросы ждем на адрес hr@agava.com.

Blog.Perl5doc.ru: Lingua::RU::Inflect - Модули CPAN

Сегодня вашему вниманию представлена документация по модулю 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.

Четверг, 4-е марта

On Perl — блог о языке программирования Perl и его сообществе: Perl 5.10 в 2010-м — части I и II

Часть I
История и статистика

Perl 5.10 увидел свет в 20 день рождения языка — 18 декабря 2007 года. Уже прошло более двух лет, и за это время успели появиться девелоперские версии 5.11.0, 5.11.1, 5.11.2, 5.11.3 и 5.11.4, и вот-вот появится версия 5.12, предназначенная для использования в реальных приложениях.

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

На CPAN сейчас хранится около 80 000 модулей в 20 000 дистрибутивах, список авторов содержит около 8000 имен. Как часто здесь используются фичи Perl 5.10?

Ответ: новые фичи встречаются в двух сотнях модулей, созданных сотней авторов.


Часть II
Фичи Perl 5.10

Кратко о том, что появилось в Perl 5.10.

— Встроенная функция say, которая работает аналогично print, но добавляет перевод строки.

— Оператор сопоставления (смартматчинга) ~~ сопоставляет свои аргументы согласно здравому смыслу (и, разумеется, четким правилам, описанным в документации). Например, в этих примерах аргументы имеют разный тип, но используется один и тот же оператор.

$a ~~ /\d/

$a ~~ @list

@list ~~ %hash

— Составной оператор выбора под условным названием switch. С помощью новых ключевых слов given, when и default возможно создать условную конструкцию, аналогичную switch/case в C и других языках. Важное отличие в том, что внутри given происходит не простое сравнение, а сопоставление (или смартматчинг).

given($x) {
    when(/a/) {...}
    when('b') {...}
    default   {...}
}

— Модификатор state позволяет создавать лексические переменные, сохраняющие значение между вызовами подпрограммы. Использование state похоже на объявление автоматической переменной со словом static в C.

sub counter {
    state $c = 0;
    return ++$c;
}

— Новшества в регулярных выражениях. Регулярные выражения существенно переработаны, в частности, добавлены именованные сохраняющие скобки. В этой статье про регулярные выражение почти не упоминается, поскольку они достойны отдельного рассказа.

(?<name>)
\K
\R
%+
%-
\g<name>

— Бинарный оператор defined-or (//). Возвращает первый из аргументов, который содержит определенное (не undef) значение. Может использоваться и в варианте с присвоением.

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

$city = $arg // 'Moscow';

$vacancy{city} //= 'Moscow';


Продолжение будет.

Stupid notes on my fucking life: Задачка для Perl-воклассников

Имеется сверхбольшой XML документ вида:

<?xml version="1.0" encoding="utf-8"?>
<envelope>
        <head>
                <title>Whatever what</title>
                ...
        </head>
        <body>
                ...
                        <item>Item1</item>
                        <item>Item2</item>
                        ...
                        <item>ItemN</item>
        </body>
</envelope>

На его основе требуется создать XML документ меньшего размера - подобный исходному, сохранив только первые N элементов "item". Well-formed XML подразумевается как на входе, так и на выходе.

Решение:

Подвох в том, что в полевых условиях между элементами "item" может не оказаться маркеров новой строки, и тогда вполне логичным кажется использование "тяжелой артиллерии" в виде какого-нибудь SAX-парсера и сериализатора. На самом деле, в этом нет необходимости, если проявить солдатскую смекалку, воспользовавшись переменной $/, что вполне себе позволительно, поскольку по условию задачи исходный XML-документ well-formed.
#!/usr/local/bin/perl
use strict;

my ($filename, $max_items) = ("test.xml", 1);

local $/ = "</item>";

open(my $fh, "<:utf8", $filename) || die qq/Cannot open $filename for reading: $!/; my $last_str; $. > $max_items ? ($last_str = $_) : print while <$fh>;

print $last_str if defined($last_str);

# Perl is supposed to close $fh for us.

Shoor/нал: Работа над ошибками

Lingua::RU::Inflect 0.02:

  • Документация на cpan.org показывается в правильной кодировке. Правда, всё равно pod2html ругается, что не знает слова =encoding, а в man-страницах кириллица пропадает вовсе.
  • Добавлена документация на русском языке.
  • Добавлена функция choose_prepositions_by_next_word для выбора предлога с беглой гласной по следующему за ним словом, а также куча коротких имён для вызова этой функции с разными предлогами: izo, ob, so и т. п.
  • Добавлены новые тесты. Выявленные при добавлении баги пофиксены.

Среда, 3-е марта

On Perl — блог о языке программирования Perl и его сообществе: 10+

На основе записей в трудовой книжке.

1999, Москва

— Я программирую на Perl. Особенность в том, одно и то же действие можно записать по-разному. Это и непривычно, и немного сложно, но интересно.

Это сказал мой товарищ, который в то время делал сайт одного из поставщика радиодеталей. Я же в то время писал на C++ программы для обработки данных физических экспериментов по сталкиванию частиц, делал статистический анализ данных, замаскированных шумом, и пытался применять новейшие математические приемы — вейвлеты — для анализа электрокардиограмм.

В книжных магазинах моего родного города я давно видел несколько книг с большими буквами PERL. Неосознанно я хотел узнать, что это, но тогда буквы значили не больше, чем аббревиатура VRML. Не хочу сказать, что произнесенные между делом слова товарища повлияли на мой выбор, но и отрицать этого не стану.

2000—2010, Москва

С этого года Perl стал меня кормить. За десять лет я совершенствовал себя и свои знания в журнале «Радио», фонде научных исследований «Прагматика культуры», студии Артемия Лебедева (да-да, там я тоже делал некоторые вещи на перле), российском информационном агентстве «РИА Новости», компании Q1 и в ООО «Гностик».

2010, Амстердам

В марте я подписал контракт с компанией Booking.com — еще одним лидером интернетов, который знает толк в перле и где не стыдно работать.

Blog.Perl5doc.ru: Обзор записной книжки Perl тестера - Тестирование программ

Ниже приводится вольный перевод раздела 'Overview' из книги "Perl Testing A Developer's Notebook"

cover.jpg

Обзор

Есть ли в разработке программного обеспечения тема сексуальнее, чем тема о тестировании программного обеспечения? Что это кроме программирования игр, 3D графики, аудио, высокопроизводительных кластеров, хороших сайтов и.т.д ? Во всяком случае, тестирование находится ниже этого списка. И это прискорбно, потому что хорошее тестирование может увеличить производительность, улучшить дизайн, поднять качество, облегчить накладные расходы, и помочь удовлетворить ваших клиентов, сотрудников и менеджеров.

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

Как и все книги из серии Записная книжка O'Reilly', эта книга пропускает скучную прозу и сосредотачивает внимание на серии упражнений, которые показывают практические примеры реализации задач.

"Записная книжка разработчика: Perl тестирование" поможет быть в теме и:

  • Создавать базовые тесты Perl с легкостью и интерпретацией результатов

  • Применять специальные методы и модули для улучшения ваших тестов

  • Включать наборы тестов в ваши проекты

  • Тестировать базы данных и их данные

  • Тестировать веб сайты и веб проекты

  • Использовать единый формат вывода результатов тестирования(Test Anything Protocol/TAP) с тестами проектов, написанных на других языках

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

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

On Perl — блог о языке программирования Perl и его сообществе: Массив или список — ответы

Из 49 ответов на вопрос «@var — это массив или список?», оставшихся после отсеивания накруток сторонников массивов, сложилась такая картина общественного мнения:

Вторник, 2-е марта

Александр Симаков — Perl: Programming Web Services with Perl

On Perl — блог о языке программирования Perl и его сообществе: Trim

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

Вместо двух замен

$str =~ s/^\s+//;
$str =~ s/\s+$//;

Себастьян указывает на такой вариант:

$str =~ s/^\s*(.*?)\s*$/$1/;

Интересно почитать и комментарии, где предлагают несколько похожих вариантов с альтернативами в регулярном выражении:

$str =~ s/(^\s+|\s+$)//g;

$str =~ s/(?:^\s+|\s+$)//g;

$str =~ s/^\s*|\s*$//g;

$str =~ s/^\s+|\s+$//g;

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

Павел Кудинов: про конференции

Планирую участие на конференции [info] oleg_bunin РИТ++

До сих пор участвовал только в конференциях Олега, впечатления самые положительные. Первый раз участвовал 3 года назад, в апреле 2007 года, РИТ 2007, это была моя первая конференция, новый для меня опыт, сразу с 3 докладами:

Архитектура рекламной сети "КиноМедиа" - самый первый доклад, о моём первом большом специфическом проекте
Поисковый спам - устроил небольшое шоу "я - спамер" :)
Практическое применение XSLT в рамках REST - помечтал о технологиях

Затем осенью удачно выступил на HighLoad 2007 с докладами:

Высоконагруженные приложения как совокупность веб-сервисов
Сетевая многозадачность: событийные машины

на РИТ 2008 был в качестве гостя с братом [info] scarych , на HL++ 2008 был с докладом

Архитектурные приемы: онлайн-игры

К сожалению, по личным обстоятельствам пропустил РИТ 2009 и hl++ 2009.

На предстоящем РИТ 2010 хочу сделать

совместный доклад в секции MayPerl с моим коллегой по "Точке Кипения" и другом [info]sharifulin
забавный блиц-доклад в общей секции РИТ
полноценный доклад в общей секции РИТ (возможно, если сформулирую достойную тему)


Обновил профиль: Технический руководитель игры dozory.ru, поисковый спамер ("black seo"), большой любитель perl и сетевого программирования.

ВНИМАНИЕ, СПОЙЛЕР :) Также впервые серьёзно задумался о том, чтобы выложить свою закрытую разработку, которой плотно занимаюсь последние 2 года (мой собственный компактный pure perl асинхронный сетевой мультиплексор, альтернатива POE/AnyEvent/...)
Если сделаю это, пожалуй, выберусь с Шитовым и Шарифулиным на очередную международную YAPC с презентацией, оно того стоит.

До встречи на РИТ!

Shoor/нал: Десять или восемь?

Задумался, делать ли в Lingua::RU::Inflect проверку наличия элемента в списке циклом (который работает везде) или же взять появившийся в 5.10 оператор ~~.

Вроде бы, с одной стороны, требовать от юзера апгрейдить перл только лишь из-за того, что мне лень писать цикл — нехорошо. Более того, заставлять апгрейдиться на живом сервере (а потом ещё надо будет perl-after-upgrade делать, что тоже потребует какого-то времени) — совсем никуда не годится.

С другой стороны, компактный код, при том, что пишется быстрее, ещё и понятнее выглядит.

P. S. В /var/db/pkg/perl-5.10.1/+REQUIRED_BY обнаружил строку bsdpan-Lingua-RU-Inflect-0.01 — откуда она там? В /var/db/pkg/perl-5.8.9_3/+REQUIRED_BY её нет. И вообще, откуда у меня вдруг два параллельных перла-то взялось? Я, вроде, версию 5.10 специально не ставил...

upd/17:40: Снёс 5.8, оставил только 5.10. Но вот как провернуть безболезненный апгрейд на сервере? Что-то я опасаюсь ненулевого даунтайма. А, возможно, и на час он может растянуться, что плохо.

Старое криведко: Сам себя не похвалишь... :)


* thanks to optimizations from chromatic, Jonathan, and Vasily, Rakudo has a lot of speed improvements
* in particular, it can run those tests in under 10 minutes, non-parallel, depending on your hardware
* older releases took 25 minutes and more

Perl 6 Design Minutes for 24 February 2010

Патрик конечно скромничает, про вклад nqp-rx в это дело, но всё равно приятно :)

Воскресенье, 28-е февраля

Stupid notes on my fucking life: Баг, который никто не хочет пофиксить

Модуль XML::Parser::Expat создавался в те далекие времена, когда XML файлы длиннее 2Gb не могли присниться даже в самом страшном сне любому относительно-нормальному человеку. Но времена изменились, и теперь многогигабайтные XML-файлы - не редкость. А между тем, метод XML::Parser::Expat::current_byte() по-прежнему возвращает число типа long вместо long long.

При этом, в очередной раз поражает инертность Perl-сообщества. Вместо того, чтобы просто взять и подправить Expat.xs надлежащим образом, взволнованные пользователи пишут: "... this is not an issue when using a 64 bit version of perl.". Кстати говоря, впервые проблема была озвучена не менее 4-х лет назад. А в RT открытыми остаются по меньшей мере три! примерно одинаковых баг-рипорта.

allframeworks / Perl: Mojolicious первые шаги. Hello world на Mojolicious!

На прошлом уроке, мы установили Perl и наиболее подходящий редактор исходного кода. Начинается самое интересное! Сегодня мы установим Mojo, рассмотрим основы работы с ним и напишем «Hello World!». Прежде чем переходить к установке, посмотрим, что же такое Mojo вообще и для чего он нужен. Mojo — не просто фреймворк, как например Codeigniter или Kohana для PHP. Mojo — это набор библиотек, для создания своего фреймворка, т.е. фреймворк для фреймворка (как-бы странно это не звучало). В стандартную поставку Mojo входит два «готовых» фреймворка, которые можно использовать для написания приложения/сайта — Mojolicious и Mojolicious::Lite. C первым из них мы и будем сегодня знакомиться.

Blog.Perl5doc.ru: perl5100delta - прагма 'mro' - История и развитие Perl

Новая прагма mro

Добавлена новая прагма, mro ( для порядка разрешения метода(Method Resolution Order )). Это позволяет переключаться на базовый класс (per-class basis), алгоритм, который perl использует для поиска унаследованных методов в иерархии множественного наследования. По умолчанию MRO не изменен ( Поиск в глубину (DFS, Depth First Search ). Другой MRO имеется в наличии: C3 алгоритм. Смотрите mro для получения более подробной информации (Brandon Black)

Отметим, что в связи с изменениями в осуществлении поиска иерархии класса, код, который используется для присвоения *ISA неопределенного значения скорее всего будет прерван. Во всяком случае, присвоение неопределенного значения *ISA имел побочный эффект удаления магического массива @ISA а это не должно было происходить. Также, кэш *::ISA::CACHE:: больше не существует, чтобы заставить сбросить кэш @ISA, теперь нужно использовать mro API, или же просто осуществить присвоение массиву @ISA (например @ISA = @ISA ).

Shoor/нал: Re: Слайды! Слайды!

Увидел сегодня на UWDC ещё один метод быстрого создания презентаций — свердловчане Антон Халиков и Роман Иманкулов использовали в своих докладах S5: A Simple Standards-Based Slide Show System — систему, где презентация хранится в HTML-файле. S5, в отличие от takahashi, работает (вроде бы) в разных браузерах (а не только в файрфоксе < 3.6) — у меня оно успешно заработало в Google Chrome. Достигается это за счёт использования не специфического для мозиллы XUL-файла, описывающего интерфейс, а обычного HTML: синтаксис самого описания презентации получается более сложным по сравнению с простым текстовым описанием, применяемым в takahashi, но тому, кто знает HTML, это не страшно. Внешний вид, вроде, можно выбирать из готовых тем, а можно и перекрасить всё вручную правкой CSS-файла.

В качестве тренировки слепил коротенькую презентацию о Lingua::RU::Inflect — можно делать блиц-доклад? :-)

Суббота, 27-е февраля

Shoor/нал: Больше предлогов, хороших и разных

Вчера перенёс свеженаписанные функции выбора предлога в модуль, добавил к ним пару не экспортируемых по умолчанию синонимов — ob и so, сделал тесты, подправил модуль, чтобы проходил новые тесты — да призадумался: а что, если изменяющихся предлогов больше? Не писать же свою функцию на каждый, надо бы оптимизировать процесс. Сегодня, по пути на UWDC попробовал вспомнить, что же есть в русском языке: насчитал кучу групп: в/во, к/ко, из/изо, над/надо, о/об/обо, перед/передо/пред/предо, под/подо, с/со — и вполне возможно, что это ещё не всё. Надо будет Дитмара нашего Эльяшевича почитать, проверить свои познания в области русского языка. Посему релиз версии 0.02 откладывается на время чтения Розенталя и придумывания универсальной функции выбора предлога.

P. S. Технические доклады на UWDC — интересны, докладчики молодцы. То, что я слышал из других областей (про CRM и «Как стать популярным блоггером») — какая-то невнятная вата.

perl | Misc: Mini Facebook Sender

Написал небольшой скрипт рассылки по фейсбуку [!] На данный момент шлет только по друзьям [+] Многопоточность [+] Антикапча [+] Ротация сообщений [+] Автообновление Настройка скрипта производится в файле config.cfg. Скрипт практически не тестировался. Обо всех ошибках и пожеланиях просьба сообщать в комментариях. P.S. Если используете аккаунты, не подтвержденные по смс, то будет много капчи. Скрипт: скачать Также рекомендую почитать: Чекер одноклассников (5) Услуги (7) Спаммер смс (МТС) (8) Спаммер [...]

Пятница, 26-е февраля

On Perl — блог о языке программирования Perl и его сообществе: Что для вас @var?

Как вы называете в повседневном обиходе переменную с именем @var? Массивом или списком?

Проголосуйте

Shoor/нал: О выборе предлогов

Продолжаю баловаться двумя языками — перлом и русским:

#!/usr/bin/perl -wl -CS

use strict; use utf8;

$,=' ';

sub choose_preposition_about_by_next_word { return /^[аиоуыэ]/i ? 'об' : 'о'; }

sub choose_preposition_with_by_next_word { return /^с[^аеёиоуыэюя]/i ? 'со' : 'с'; }

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

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

Наверное, добавлю эти функции в Lingua::RU::Inflect — и можно будет сегодня-завтра выложить версию 0.02.

http://juick.com/sharifulin/567153

Нашел очень хороший сервис по Perl perl5doc.ru Это добавок к beshenov.ru и perlrussia.ru

http://juick.com/sharifulin/567149

Перевод документации по модулю Mojo::Base blog.perl5doc.ru

http://juick.com/sharifulin/567097

Презентация попала в Hot on Twitter на slideshare.net, пришел фидбек про то, что есть ошибки, исправил :) slideshare.net Viva la revolution!

Алексей Капранов: Github — это новый CPAN

(http://github.com/languages/Perl — очень хорошая ссылка для регулярного посещения)


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


Кстати, с помощью cpanminus можно устанавливать модули прямо с гитхаба.

Пример:
% cpanm --sudo http://github.com/kappa/Tenjin/tarball/master

Read and post comments | Send to a friend

Четверг, 25-е февраля

i-t-шные заметки: bless and curse

Поскольку в перле есть функция bless, то по логике должна быть функция curse, которая совершает обратное действие.
На CPAN есть несколько модулей, реализующих подобную функцию, например Acme::Damn.

Из описания модуля:

Acme::Damn provides a single routine, damn(), which takes a blessed reference (a Perl object), and unblesses it, to return the original reference. I can't think of any reason why you might want to do this, but just because it's of no use doesn't mean that you shouldn't be able to do it.

Perl — Говнокод.ру: Perl / Говнокод #2673

Фильтрация хэша - удаление элементов, чьи ключи не удовлетворяют некому условию. Конечно же использование православного for для Perl-истов ниже собственного достоинства.... :X %words = map { $_ => $hash{$_} } grep { !proper($_) } keys %words;

Записки программиста — Perl: Основы программирования на Perl (часть 2)

Ну вот дошли руки написать продолжение к посту Основы программирования на Perl. В этой части речь пойдет об условных операторах и циклах. Условные операторы Как всегда, начнем сразу с примеров. $a = shift; if($a > 10) {   print "a > 10\n"; } Программистам на C-подобных языках эта конструкция должна быть до боли знакома, так что комментировать тут особо нечего. Скажу [...]

Сообщество ru_perl в LiveJournal: Вакансия Perl-программиста. Москва

Приглашаем на работу программиста Perl.

Требования:

  • опыт работы с perl, mod_perl;
  • опыт интернет-программирования;
  • опыт работы с реляционными СУБД.

Обязанности:

  • разработка кода программного продукта согласно производственным заданиям;
  • альфа-тестирование результатов труда, исправление ошибок, модернизация существующего кода к новым требованиям.
Условия:
  • работа в офисе — г. Москва, м. Владыкино, полная занятость (40 часов в неделю);
  • заработная плата от 50 до 90 тысяч рублей в месяц, определяется по результатам собеседования.

Резюме высылайте по адресу: ivan@bazetov.ru

Мопед не мой, я просто разместил объяву.

Анатолий Шарифулин: Perl. Perlburg. Mojolicious. Viva la revolution!

Отличная поездка получилась Ростов-на-Дону – Москва – Екатеринбург – Москва – Ростов-на-Дону.

В Екатеринбурге я выступил на Perlburg 2010. Воркшоп мне понравился, Ебург тоже, только немного холодно было :)


Блиц-доклад CPAN: модули, авторы и документация



Доклад Mojolicious. Веб в коробке! (третья версия, расширенная)



Английская версия доклада Mojolicious. The web in a box!



use Mojolicious or die;

Viva la revolution!

use Perl or die;

JFDI


ЗЫ: Немного фоток с Екатеринбурга http://picasaweb.google.com/sharifulin/Perlburg2010



Blog.Perl5doc.ru: Mojo::Base - Модули CPAN

Название

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.

Perl — Говнокод.ру: Perl / Говнокод #2668

А вам тоже нравятся безымянные параметры? А писать код без пробелов? Кроме того, эта функция, вызывая себя рекурсивно, каждый раз заново открывает, читает, парсит и закрывает один и тот же файл шаблона. # (S) (рекурсивного вызова) Генерирует контент слота рекурсивного дерева (с плюсиками). Возвращает ('RecursiveSlot'=>$textbuf) или () sub PlusTreeSlot { # (P) Путь к шаблону контентной ячейки # (P) ghm # (P) pid # (P) treename # (P) Уровень # (P) функция # (P) $ret return () if !exists($_[1]->{$_[2]}); # Не вкладываем ничего в слот если там ничего нет my $textbuf; foreach (@{$_[1]->{$_[2]}}){ my $ret=&{$_[5]}($_,$_[4],ref($_[6])?dclone($_[6]):$_[6]) if $_[5]; $textbuf.=${tmpl_prepare($_[0],{ PlusTreeSlot($_[0],$_[1],$_->{'id'},$_[3],($_[4]+1),$_[5],$ret), %{$_}, 'trname'=>$_[3], })}; }; return ('RecursiveSlot'=>$textbuf); };

Perl — Говнокод.ру: Perl / Говнокод #2666

двузначные цифры в дате my $sec; my $min; my $hour; my $mday; my $mon; my $year; my $wday; my $yday; my $isdst; ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =localtime(time); $year=$year+1900; $mon=$mon+1; if ($mon<10) { $mon='0'.$mon; } if ($sec<10) { $sec='0'.$sec; } if ($min<10) { $min='0'.$min; } if ($hour<10) { $hour='0'.$hour; } if ($mday<10) { $mday='0'.$mday; }

Moscow.pm 2.0: Офлайн №19

В четверг, 25 февраля, состоится 19-я офлайновая встреча группы Moscow.pm. Приглашаем всех желающих присоединиться к нашему столу в кафе «Московское время» начиная с 18:30.

On Perl — блог о языке программирования Perl и его сообществе: Perl на РИТ++

РИТ++Открыт сайт конференции РИТ++ (Российские интернет-технологии) 2010 года. Конференция пройдет в Москве 12–14 апреля.

В этом году на РИТ++ отдельным потоком пройдет «вложенное» мероприятие — конференция MayPerl (да-да, в апреле).

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

  • Патрик Мишо (Patrick Michaud)Perl в крупных организациях;
  • Perl 6;
  • Perl в сравнении с другими языками программирования.

В конференции примет участие Патрик Мишо (Patrick Michaud), архитектор компилятора Perl 6 Rakudo. Именно этой весной планируется выпустить первый релиз.

Регистрация, оплата и личный кабинет находятся на общем сайте конференции РИТ++. Присоединяйтесь (=заставьте своего работодателя вложиться в Perl)!

http://juick.com/mvuets/564279

$ perl -Mstrict -e 'my $k; foreach $k (qw foo bar baz) { last if $k eq "bar" } print "$k\n"' Я ожидал увидеть bar ): Интересно, что если написать my $k = "qux", то qux и получим. Получается, foreach выполняется в своей лексической области видимости.

Среда, 24-е февраля

Алексей Капранов: Презентации с Perlburg 2009

Я понимал, что Perlburg проходит в университете и что вокруг будут скорее академики, чем производственники. Поэтому сделал два доклада «за жизнь» на весьма общие темы, потенциально интересные тем не менее, широкому кругу студентов и преподавателей.

Атака на Boilerplate (ссылка работает только в Firefox версии ниже 3.6)

Перл Ката (ссылка работает только в Firefox версии ниже 3.6)

(Печально, но факт: движок Takahashi-презентаций перестал работать в последнем Firefox 3.6 — у меня на ноуте стоит специальная версия 3.5.8 строго для демонстрации слайдов. Есть пара мыслей, что с этим сделать, но пока увы. Извините, если что не так. Смотреть там всё равно нечего, как обычно.)

Второй доклад завершился 20-минутным показательным ката по TDD. Огромными буквами на проекторе я запрограммировал классический String Calculator строго по TDD с использованием Test::Most для написания тестов и великого, не побоюсь этого слова, пакета для фонового запуска тестов Test::Continuous. Его, кстати, рекомендую попробовать всем, кто практикует TDD.

Read and post comments | Send to a friend

Мета

Поиск

Участники

Список участников в формате OPML OPML

Добавить сайт

По-другому

Приборы

Rambler's Top100