Воскресенье, 9-е мая

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

А вот так мы записываем в файл. И нас не интересует многопоточность или проверка имени файла (в вызывающей функции тоже нет). А не записать ли нам ../index.html? Прошу не кидаться калом. Первый раз вижу перл. Может быть так и надо? Волшебник-интерприатор все поправит, и не даст сучиться ужасному? ps взято с разломанного недображелателем хостинга, для того, чтобы "поправить все как следует". sub PrintToFile { my ($filename, @file) = @_; @file = sort {$a <=> $b} @file; open BK, ">backup.txt"; foreach $line(@file) { print BK "$line"; } close BK; rename "backup.txt", "$filename"; unlink "backup.txt"; }

Суббота, 8-е мая

http://twitter.com/yapcrussia/statuses/13572010093

yapcrussia: Наш корабль уже готовится. Вот он: http://yapcrussia.org/img/ekolog.jpg #yr2010

Пятница, 7-е мая

http://juick.com/sharifulin/694432

вот что написал gist.github.com

Хабрахабр: Метки / perl: Блог им. meettya / Slice, или очень полезные ломтики в Perl

Решая задачи реального мира нам постоянно приходится работать со списками данных. И самые счастливые в этой деятельности — Perl-программисты :)

Это все потому, что для работы с частью массива или хеша у нас есть удобный slice. Slice — это не оператор, это принцип обработки данных, когда от большого объекта отрезается кусочек.
Проще показать:

Сообщество ru_perl в LiveJournal: мастер-класс / Построение высокопроизводительного асинхронного веб-приложения для SEO

На DevConf буду проводить Perl-мастер-класс: построение высокопроизводительного асинхронного веб-приложения для SEO (в реалтайме узнаем у яндекса положение сайта по ключевым словам).

Используем AnyEvent::HTTP::Server (Монс, привет!), WebSocket-ы, AnyEvent::HTTP, AnyEvent::DBI и ещё массу всего вкусного (это кроме вкусного кофе, шоколадки и булочек ;)

Описание мастер-класса: http://devconf.ru/perl/offers/76
Регистрация на мастер-класс: http://devconf.ru/register/index/perl/

Описание конференции: http://devconf.ru/page/about/
Описание меня: http://zloy-razboynik-barmaley.moikrug.ru/

Будет интересно :)

Четверг, 6-е мая

Анатолий Шарифулин: Perl 5.12 и Bundle::TK

Обновили на нескольких серверах Perl до версии 5.12, идем в ногу со временем, круто :)

Такой ни кайф ставить одни и те же модули.
Поэтому я наконец-таки сделал модуль Bundle::TK (скоро будет доступен на CPAN), включает в себя Perl-модули, которые мы обычно используем и на которых написаны наши проекты (старые и не очень). Бандл пока не содержит Mojolicious-модули (нет стабильной версии, используем версию Mojolicious с github.com), а также самописные модули, которые еще по какой-то причине не выложены на CPAN :)

Теперь просто


cpan Bundle::TK

Ждем 20 минут, ставим половину CPAN и все работает. Ура!

 
Интересные цифры: до установки Bundle::TK модулей (*.pm) было 711, после установки 2357, а модулей в папке ~/lib36, ~/mojo105.

Давно я уже не подготавливал модулей для CPAN, очень помогла моя презентация с YAPC::Russia 2009, рекомендую :)

Среда, 5-е мая

Хабрахабр: Метки / perl: Блог им. Savvateev / Средняя длина слова у разных авторов

Пока никто не сказал: «Зачем придумывать велосипед?», и в этот велосипед не полетели помидоры, сразу говорю, что средняя длина русского слова давно посчитана и составляет 5.28 символа. Вот ссылка на источник. А этот топик меня сподвигло написать следующее. При обсуждении моего предыдущего поста хабраюзеры stetzen и alienator высказали предположение, что средняя длина слова у различных авторов будет отличаться в зависимости от их стиля изложения, а может быть каких-то анатомических различий, уж не знаю. Кстати, попробуйте угадать среднюю длину чего больше всего ищут в гугле. В общем я решил проверить так ли это на самом деле.

Язык_Perl | Сообщества на YVISION.KZ: Курс валют на сегодня

Всем привет.

В продолжение моей эпопеи по созданию мелких никому не нужных веб-сервисов, поговорим о Чаке. Не о Чаке Норрисе и не о зулусском правителе, а о простом сервисе, который знает курс для 31 наименования валют.

Конечно, в формате этого блога надо показать, как это делается.

Итак, для начала нам надо знать, что нацбанк Казахстана публикует курс для этих валют у себя на сайте в виде RSS.

Совершенно правильно было бы воспользоваться этим и написать модуль, забирающий эти данные по LWP, например, и превращающий RSS-ленту в удобный для дальнейшего использования набор данных.

 

    
    package Local::Chaka;

use strict; use warnings;

use XML::Simple; use LWP::Simple; use Data::Dumper;

my $debug = 0;

# Возвращает список всех валют sub get_currency_list { my $url = 'http://www.nationalbank.kz/rss/rates_all.xml';

# Получить ответ от Нац. Банка my $response = get( $url );

unless ( $response ) { # Не получен ответ от банка error_log('Не получен ответ от банка'); return; }

my $xml; eval { $xml = XMLin( $response ) };

if ( $@ ) { # Получен невалидный XML error_log('Получен невалидный XML'); return; }

# Надо превратить этот массив во что-то более # ожидаемое my $item_list = $xml->{channel}->{item};

my @res; for my $item ( @{ $item_list } ) { push @res, { currency => $item->{title}, rate => $item->{description} }; }

debug_log( 'currency_list: ' . Dumper( @res ) );

return ( scalar @res ) ? @res : undef; }

# Возвращает актуальный курс отдельной валюты # $currency: RUB, USD etc. sub get_currency_rate { my ($currency) = @_;

my $list = get_currency_list(); unless ( $list && ref $list eq 'ARRAY' ) { # Нет списка валют =/ error_log('Нет списка валют'); return; } my ( $res ) = grep { $_->{currency} eq $currency } @$list; debug_log('curency_rate res: ' . Dumper( $res ));

return ( ref $res eq 'HASH' ) ? $res->{rate} : undef; }

#-- Utils

sub debug_log { my ($msg) = @_;

say_log( 'debug', $msg ) if $debug; }

sub error_log { my ($msg) = @_;

say_log( 'error', $msg ); }

sub say_log { my ($type, $msg) = @_;

my $date_time = scalar localtime; open my $logfile, ">>/var/logs/homepage-chaka.log"; say {$logfile} $date_time . ' [' . $type . ']: ' . $msg; close $logfile; }

 

Пояснения:

1. Модуль назвать можно как угодно, я назвал в честь сервиса на сайте =)»

2. $debug = 0 в данном случае — после того, как модуль и сам сервис протестированы. До выкатки в продакшен надо $debug = 1.

Вот и все на сегодня. Спасибо за внимание, до новых встреч в эфире =)»

З.Ы. Подумываю о создании простого API для пользования всеми желающими. ;-)

http://twitter.com/yapcrussia/statuses/13412299137

yapcrussia: Компания РЕГ.РУ http://reg.ru стала спонсором Perl Mova + YAPC::Russia, йоу! #yr2010

http://twitter.com/yapcrussia/statuses/13382991324

yapcrussia: На речную прогулку http://2010.yapcrussia.org, кстати, приглашаются все желающие, даже те, кто не пишет на перле. #yr2010.

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

Наконец можно объявить подробности того, как будут распределены дни на совместном мероприятии в Киеве:

На третий день — в России он выходной — запланирована теплоходная прогулка по Днепру. Начало в 10 утра, возврат к Речному вокзалу в 18 часов (можно успеть на ночной поезд до Москвы).

Регистрируйтесь, приглашайте другей, берите с собой знакомых!

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

Анатолий Шарифулин: А Perl жив! :)

Всем привет!

Спасибо за внимание к прошлому трешовому посту, мне была интересна реакция.
Cамый интересный комментарий "Бог – умер" :)

Мне кажется, я собрал достаточно информация для блица про добро: "Perl – зло?!" и в первый раз будет доклад не про зло.

Perl жив, хотя бы потому, что наконец-таки закрыли баг, найденный мной в Strawberry Perl :)

[rt.cpan.org #32452] Resolved: At present, Strawberry Perl must be installed in C:\strawberry

<URL: https://rt.cpan.org/Ticket/Display.html?id=32452 >



use Perl or die;

JFDI



ЗЫ: А на слоника можно не обращать внимания, он тупо завидует)


http://twitter.com/yapcrussia/statuses/13363459145

yapcrussia: RT @briandfoy_perl: My YAPC::Russia 2009 (May Perl 2) trip: I'm only a year late with this post; I wrote it in the airport in Moscow o.. ...

http://twitter.com/yapcrussia/statuses/13362041753

yapcrussia: Perl Mova + YAPC::Russia, 3-й день — катание по Днепру на теплоходе http://social.yapcrussia.org/yr2010/purchase

http://twitter.com/yapcrussia/statuses/13362023344

yapcrussia: Perl Mova + YAPC::Russia, 2-й день — доклады http://social.yapcrussia.org/yr2010/talks

http://twitter.com/yapcrussia/statuses/13362011946

yapcrussia: Perl Mova + YAPC::Russia, 1-й день — хакмит http://social.yapcrussia.org/yr2010/talk/2745

Сообщество ru_perl в LiveJournal: Linux, signals

Господа перлознаи, всем два раза ку.
Столкнулся с проблемой на Линуксах:
- скрипт последовательно отключает и включает порт на свитче и на каждом шаге проверяет рэйт на подключенных к нему устройствах(для того чтобы узнать как происходит переключение ввода/вывода);
- соответственно в бэкграунде крутится демон реализующий sysread и syswrite(верификация записанной псеводо-случайной последовательности);
- после отключения порта ввод/вывод "останавливается" секунд на двадцать, а фактически - виснет весь процесс;

Задача - достучаться да зависшего процесса.

Обычные сигналы срабатывают только после "отлипания" процесса.
Финт ушами с алармом также не работает: 
while ( 1 ) {
     eval {
          local $SIG{ALRM} = sub { die "restart"; };
          alarm 1;
          last if ( ! $self->read_write($io) );
    };
    last if ($@ and $@ =~ /restart/);
  }
'KILL' не перехватывается, не блокируется и не игнорируется - просто прибивает процесс. Соответственно я теряю всю информацию собранную обьектом ввода/вывода.

У кого-нибудь есть идеи как реализовать эту задачу?

Спасибо.

Хабрахабр: Метки / perl: Блог им. Savvateev / Считаем буквы в произведениях русской литературы

Вы когда-нибудь задавались вопросом, какая буква русского алфавита встречается в текстах чаще остальных? Именно поиском ответа на этот вопрос я и собираюсь заняться. A пока, вы не знаете результатов моего маленького исследования, я предлагаю вам угадать пять самых распространенных букв нашего алфавита. Готовы?

Понедельник, 3-е мая

ZAG.RU: Коммунизм в эпоху perl6

Blog.Perl5doc.ru: Прагма 're' - Прагмы

re - Прагма для управления поведением ругулярных выражений Perl

Краткое описание

use re 'taint';
($x) = ($^X =~ /^(.*)$/s);      # $x помечена 

$pat = '(?{ $foo = 1 })'; use re 'eval'; /foo${pat}bar/; # не вызывает ошибку (если не указан флаг -T)

{ no re 'taint'; # отключен режим меченных данных ($x) = ($^X =~ /^(.*)$/s); # $x не помечена

no re 'eval'; # поведение по умолчанию /foo${pat}bar/; # запрещено ( независимо от того, включен -T или нет) }

use re 'debug'; # как 'perl -Dr' выводить отладочную информацию /^(.*)$/s; # на этапах компиляции и исполнения

use re 'debugcolor'; # то же, что 'debug', но с окрашенной выдачей ...

use re qw(Debug All); # Детально настроенные отладочные опции use re qw(Debug More); no re qw(Debug ALL); # Включить все отладочные опции прагмы re в текущей области видимости

use re qw(is_regexp regexp_pattern); # импортировать функции my($pat,$mods) = regexp_pattern(qr/foo/i); if (is_regexp($obj)) { print "Got regexp: ", scalar regexp_pattern($obj); # шаблон скомпилированного } # регулярного выражения преобразуется в строку

(В наших примерах используется $^X, потому что они меченные по умолчанию)

Подробное описание, примеры

Режим 'меченных данных'

Когда действует use re 'taint' и объект регулярного выражения представляет собой меченную строку, нумерованные переменные регулярного выражения и значения, возвращаемые оператором m// в списковом контексте, являются помеченными. Это полезно, когда регулярные выражения над помеченными данными предназначены не для извлечения безопасных подстрок, а для осуществления прочих преобразований.

Режим 'eval'

Когда действует use re 'eval', то в регулярном выражении разрешены утверждения, выполняющие код Perl, такие как утвреждение нулевой ширины(кодовое утверждение) (?{ ... }) и отложенные подвыражения (??{ ... }), даже, если регулярное выражение содержит интерполируемые переменные.

Для целей этой прагмы, интерполяция предварительно компилированного регулярного выражения ( создаваемого оператором qr//) не считается переменной интерполяции. Таким образом.

/foo${pat}bar/

допускается если $pat является скомпилированным регулярным выражением, даже если $pat содержит утверждения (?{ ... }) или подвыражения (??{ ... })

Режим 'debug'

При действии use re 'debug', perl выводит отладочные сообщения во время компиляции и выполнения регулярных выражений. Вывод получается такой же, как при выполнении "отладочного Perl"(скомпилированного с ключом -DDEBUGGING компилятора C) с ключом -Dr командной строки. В зависимости от сложности шаблона результирующий вывод может быть огромным. Если вместо debug указать debugcolor, осуществляется расцвечивание вывода в терминалах (если в них имеется поддержка последовательностей, управляющие цветом). Установите в переменную окружения $ENV{PERL_RE_TC} список с разделителем-запятой соответствующих свойств termcap(5) который будет использоваться для настройки подсвечивания.

Начиная с 5.9.5 директива use re 'debug' и его эквиваленты действуют в лексической области видимости, как и другие директивы прагмы. Тем не менее, они имеют эффект как во время компиляции, так и во время выполнения.

О действиях прагм можно почитать в разделе Модули прагм (perlmodlib)(пока что только на английском).

Режим 'Debug'

Аналогично режиму 'debug' отладочный вывод производится при использовании use re 'Debug', разница в том, что данный метод предоставляет тонкую настройку вывода отладочной информации. Опции разделены на три группы, одна связана с компиляцией, другая с выполнением а третья для специальных целей. Имеются следующие опции:

  • Опция компиляции
    • COMPILE

      Включает все отладочные опции связанные с компиляцией.

    • PARSE

      Включает вывод отладочной информации, связанной с процессом разбора шаблона.

    • OPTIMISE

      Позволяет связать вывод со стадией оптимизации во время компиляции.

    • TRIEC

      Подробная информация о дереве фазы компиляции.

    • DUMP

      Дамп окончательного варианта программы после его компиляции и оптимизации.

  • Работа связанных опций
    • EXECUTE

      Включает все отладочные опции, связанные с выполнением.

    • MATCH

      Включает отладку главных циклов сопоставления с шаблоном.

    • TRIEE

      Дополнительная отладочная информация по выполнению дерева кода.

    • INTUIT

      Включает отладку стартовой точки оптимизации.

  • Дополнительные отладочные опции
    • EXTRA

      Включает все "дополнительные" отладочные опции.

    • BUFFERS

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

    • TRIEM

      Включает усовершенствованную TRIE отладку. Дополняет как TRIEE так и TRIEC.

    • STATE

      Включает отладку состояния в движке.

    • STACK

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

    • OPTIMISEM

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

    • OFFSETS

      Информация дампа смещения. Он может использоваться, чтобы видеть как regops коррелирует с шаблоном. Выходной формат

         NODENUM:POSITION[LENGTH]
      

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

    • OFFSETSDBG

      Включает отладку смещения. Это выдает обширное количество информации трассировки и не цепляет также с другими отладочными опциями.

      Опция определенно полезна для тех, кто занимается профессиональным хакингом над частью смещений отладочной машины.

  • Другие полезные флаги

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

    • ALL

      Включает все опции, за исключением OFFSETS, OFFSETSDBG и BUFFERS

    • All

      Включает DUMP и все выполняемые опции. Эквивалент:

        use re 'debug';
      
    • MORE
    • More

      Включает TRIEM и все опции, выполняемые во время компиляции и исполнения.

Экспортируемые функции

Начиная с версии Perl 5.9.5 прагма re предоставляет ряд полезных функций, которые могут быть опционально экспортируемы в пространство имен вызывающей функции. Они перечислены ниже:

  • is_regexp($ref)

    Возвращает значение "истина", если является скомпилированным регулярным выражением, созданный оператором qr//, в противном случае возвращает "ложь".

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

  • regexp_pattern($ref)

    Если передано скомпилированное регулярное выражение, созданное qr//, функция возвращает его шаблон.

    В контексте списка возвращает два элемента, первый элемент содержит шаблон, второй - модификаторы, которые были использованы при компиляции данного шаблона.

      my ($pat, $mods) = regexp_pattern($ref);
    
  • regmust($ref)

    Если аргументом является скомпилированное регулярное выражение (созданное оператором qr//), функция возвращает самую длинную закрепленную фиксированную строку и самую длинную плавающую фиксированную строку.

    Фиксированная строка (анг. fixed string) определяется как подстрока, которая должна выступать для шаблона сопоставления. Закрепленная фиксированная строка (анг. anchored fixed string) - это зафиксированная строка, которая должна находиться в определенном смещении от начала шаблона. Плавающая фиксированная строка (анг. floating fixed string) - определяется как фиксированная строка, которая может появляться в любом месте из диапазона различных позиций по отношению к началу шаблона сопоставления. Например:

    my $qr = qr/here .* there/x;
    my ($anchored, $floating) = regmust($qr);
    print "anchored:'$anchored'\nfloating:'$floating'\n";
    

    выводит:

    anchored:'here'
    floating:'there'
    

    Так как в шаблоне here находится до .*, его позиция может быть определена точно. Однако нельзя сказать тоже самое для there: он может появиться в любом месте строки после позиции, до которой сопоставлена первая часть шаблона.

    Примечание: Закрепленные и плавающие строки не обязательно безусловно являются самыми длинными. Это то, что оптимизатор Perl, который вы используете, считает таковыми. Если вы считаете, что он выдает неправильный результат, пожалуйста, сообщите об этом через утилиту perlbug.

  • regname($name,$all)

    Возвращает содержимое именованного буфера последнего успешного сопоставления. Если $all истинно, тогда возвращается массив ссылок, содержащих по одной записи на буфер, в противном случае возвращает первый определенный буфер.

  • regnames($all)

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

  • regnames_count()

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

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

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

Модули прагм.

Воскресенье, 2-е мая

http://juick.com/vti/686732

Многоязычный сайт на Mojolicious — vti.showmetheco.de

XPoint.ru | Программирование::Perl::Разное: XML::Simple ошибка

Два года собственный парсер работал хорошо и вдруг перестал, где причина? Есть тестовый код из него: #!/usr/bin/perl #test.cgi use CGI qw (:standard); use CGI::Carp qw (fatalsToBrowser); use LWP::Simple; use XML::Simple; print "Content-Type: text/html\n\n"; my $xml = get("http://www.cbr.ru/scripts/XML_daily.asp"); my $r = XMLin($xml); my @v=@{$r->{Valute}}; На XMLin теперь дает массу интересных замечаний: error : input conversion failed due to input error, bytes 0x98 0xD0 0xBD 0xD0 error : input conversion failed due to input error, bytes 0x98 0xD0 0xBD 0xD0 I/O error : encoder error Entity: line 84: parser error : Premature end of data in tag Name line 84 Р ^ Entity: line 84: parser error : Premature end of data in tag Valute line 80 Р ^ Entity: line 84: parser error : Premature end of data in tag ValCurs line 2 Р ^ на нескольких других дополнительных источниках этот парсер все так же прекрасно работает, а вот принципиальный http://www.cbr.ru/scripts/XML_daily.asp хоть убей. Что поменялось? Кого трясти? Может ошибка XML::Simple у хостера? Или сам XML-код?

Суббота, 1-е мая

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

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

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

Хопа! Обновился до 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;

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

Пятница, 30-е апреля

Perl | Ky6uk's Blog: День 7: Циклы для пользы и развлечения.

Перевод на русский язык седьмой статьи цикла Perl 6 Advent Calendar.

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

В Perl 6 все изменилось.

В настоящее время для итерации по спискам используется исключительно for. foreach исчез, а C-подобные циклы обрабатываются новым ключевым словом loop. Сегодня мы не будем это обсуждать, но мы собираемся сосредоточиться на новом цикле for, который в сочетании с другими языковыми особенностями Perl 6 предоставляет чрезвычайно гибкую и мощную конструкцию.

Давайте рассмотрим обычный случай.

for 1, 2, 3, 4 { .say }

Здесь сразу заметны некоторые вещи в синтакисе. Нет скобок списка конструкций, которые распространяются на весь Perl 6. В общем, требуется много меньше скобок чем в Perl 5. Так же как и в Perl 5, по умолчанию переменная цикла $_. Вызов метода say без какого-либо применения, так же как и $_.say. Обратите внимание, что в Perl 6 по умолчанию мы не можем вызвать say без аргумента для $_, мы должны использовать .say либо явно указать $_ в качестве аргумента.

Блок не должен быть обычным блоком. Это может быть острый блок (->), который позволяет нам передавать параметр из цикла в переменную.

for 1, 2, 3, 4 -> $i { $i.say }

Острый блок похож на анонимную подпрограмму, за исключением того, что не ловит значения return. Если мы вызовем return внутри острого блока, будет возвращено enclosing routine.

Острый блок может принимать больше одного параметра из списка. Что произойдет если мы это сделаем?

for 1, 2, 3, 4 -> $i, $j { "$i, $j".say }

Теперь, если мы запустим это, то получим:

1 2
3 4

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

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

for @array { .say }

Хотя во многих простых случаях лучше использовать map:

@array.map: *.say;

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

@array».say;

Но ни одна из этих вещей не является сегодня объектом обсуждения.

Мы можем создать список номеров с помощью конструктора диапазона "..":

for 1..4 { .say }

Зачастую мы хотим создать список из $n чисел начиная с нуля, таких как индекс массива. Мы могли бы написать 0..$n-1 или использовать вариант конструктора диапазона 0..^$n, но Perl 6 предоставляет удобный инструмент в форме "^":

for ^4 { .say }

Который выведет:

0
1
2
3

Одной из причин, по которой люди часто ссылаются на C-подобный стиль циклов в Perl 5 является необходимость знать что индекс в массиве они находят для каждого элемента, или необходимость перебирать два или больше массивов параллельно. Perl 6 предлагает для этих целей оператор Z (zip-оператор, оператор «застёжка»).

for @array1 Z @array2 -> $one, $two { ... }

Предполагая, что два массива одинаковой длины, в $one будет каждый элемент массива @array1 и в $two будет соответствующий элемент массива @array2. Если они различной длины, то итерация будет остановлена на последнем элементе самого короткого массива.

Зная это, и зная то, что в Perl 6 есть «ленивые» списки генераторов, мы можем легко включить индекс массива в итерацию:

for ^Inf Z @array -> $index, $item { ... }

Хотя, если бесконечные списки нервируют вас,

for ^@array.elems Z @array -> $index, $item { ... }

даст вам тот же результат, но, возможно, самое элегантное представление:

for @array.kv -> $index, $item { ... }

@array.kv возвращает ключи и значения попарно, где ключи массива являются индексами, так что, повторив итерации над ними два раза, мы получим желаемый эффект.

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

А что, спросите вы, если я захочу перебрать четыре массива за раз?

for @one Z @two Z @three Z @four -> $one, $two, $three, $four { ... }

Вот список ассоциативных инфиксных операторов, то есть – наслаждайтесь.

© Оригинальная статья.

P.S.: Спасибо товарищу bvp за помощь в переводе.

Похожие статьи

Четверг, 29-е апреля

Хабрахабр: Метки / perl: Блог компании DevConf / DEVCONF::GetFreeLogin(x00) — уже более 600 участников. Next level: Теперь каждый x00 участник участвует бесплатно

Благодаря огромной поддержке сообществ WEB-разработчиков — оргкомитет принял решении поощрять каждого x00 сотого участника основного дня DEVCONF 17 мая — бесплатным участием 17мая — все веб-технологии Python, Perl, PHP, Ruby, .NET за один день devconf.ru/ x00 — ваш пропуск на DEVCONF 2010 17мая! Торопитесь уже 50% мест занятно. Официальный twitter конференции http://twitter.com/devconf_ru

Среда, 28-е апреля

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

Шаблонизаторы — зло.

use XSLT or die.

Perl на ya.ru: Буфера, они же сиськи

Коллеги, очень голову сломал уже... Как бы мне задрать размер буфера для файлхендла? Есессно, версия перла 5.8+++ (5.10.1), т.е. setvbuf() не канает.

Анатолий Шарифулин: Perl – гавно!

 Всё, Perl – гавно!


"Я смотрю в будущее и в будущем Perl нет!"


use Perl and die;

JFDI

Вторник, 27-е апреля

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

В рассылке Moscow.pm обсуждают интересную мысль — выделить один день из Perl Mova + YAPC::Russia на проведение хакмита.

Сразу предложили массу тем:

  • AnyEvent — наимовский benchmark, народ сможет пощупать event based
    разработку и Монс там сможет помочь :)
  • У Руслана есть бесконечный TODO по Devel::PPAP.
  • Rakudo с Джонатоном.
  • Mojo с Шарифулиным и Юрой, можем копать сам фреймворк, можем взять
    и наваять что-нибудь на нем.

Предлагайте идеи и регистрируйтесь!

http://juick.com/vti/677633

JSON::XS в Mojolicious? Легко! bit.ly

Мини-портал Perl на Opennet: Первый стабильный релиз системы управления контентом MjNCMS

Вышел первый стабильный релиз новой системы управления web-контентом MjNCMS , написанной на языке Perl и распространяемой в рамках свободной лицензии Artistic.

Сообщество ru_perl в LiveJournal: ru_perl @ 2010-04-27T11:49:00

Всем привет, небольшой анонсик - наклепал на Perl CMS'ку, и выложил под Artistic.
Фичи:

Единая авторизация с форумом (smf, расширяемо).

Юзер модель делит юзеров на рабочие места + роли на этих местах
Юзер может менять место:роль комбо из разрешённых
Юзер может подменять других юзеров (прозрачная замена)
Весь цикл регистрации на сайте: регистрация, подтверждение, профиль, напомнинание пароля

Система расстановки разрешений - для рабочего места, для роли

Поддержка mysql кластерной конфигурации (запись на один сервер, чтение с других), разные группы кластеров для разных целей.

Поддержка груп memcached серверов

Редактор меню, категорий, страниц, их переводов, коротких url'ов.

Многоязычность, host/ru/some, host/en/some из коробки, поддержка переводов текста через админку. (В качестве кодов - латинские фразы, если перевод не найден, он откладывается в memcached для перевода попозже)

сессии юзера вроде пхпшных (т.е. хеш данных сохраняемый в бд)

Template-Toolkit как шаблонизатор по умолчанию

Вообщем,написано много кода, ещё больше предстоит (наверное) фиксить/дописать :) а в целом оно рабочее.

Картинки: http://github.com/lefedor/mjncms/tree/master/DOCS/screenshots/

http://groups.google.com/group/mjncms

Хабрахабр: Метки / perl: Великий Язык PERL! / NetBeans IDE — голосуем за поддержку Perl

Я уверен, что многие из нас сталкивались с NetBeans — в обзорах ли, — или же просто в поисках IDE.

Конечно, тру-перловоды используют vim, Eclipse или менее популярные штуки, — но крайне бы хотелось увидеть поддержку Perl в NetBeans.

Лично мне, в силу своих привычек, приходится использовать два редактора — Komodo Edit для Perl и NetBeans для Java/PHP — и я проникаюсь NB всё больше и больше — тормозит меньше, чем Komodo, обладает вагоном фич и маленькой тележкой приятностей, умеет «рефакторить» и тайдить код, приятное и логичное разворачивание проектов — в общем-то я не буду перечислять все его Features, — просто советую скачать да посмотреть — благо, что он кроссплатформенный.

Perl на ya.ru: Добавление строчек в середину файла

Я вот не придумал ничего умнее чем вставка  после метки. Может быть есть способ лучше?

http://juick.com/mvuets/676361

Делаю контрольную работу по менеджменту и маркетингу (хм, а выглядит как экономика предприятия). Много расчётов и все однотипные, потому автоматизирую процесс. На Перле делаю расчёты. На Mojo::Template пишу ЛаТеХ самой работы и смешиваю его с подсчитанными данными. Камрадики посоветовали использовать гнуплот (#669982 спасибо, кста, крутая няшка!), потому результаты сливаю и ему, а он за это рисует красивые гистограммки. Так и продвигается: omploader.org

Понедельник, 26-е апреля

Язык_Perl | Сообщества на YVISION.KZ: Яндекс.Фотки API и Perl

Привет всем.

Расскажу-ка я сегодня историю про то, как я прикручивал раздел с фотографиями к своей недавно созданной странице.

Суть всего происходящего — использовать отдельные сервисы для администрирования свего веб-сайта. Где-то блоги, где-то твиттер, где-то еще чего…

Надо сказать, что выбор, какими сервисами пользоваться, отчасти зависел от того обстоятельства, найдутся ли соответствующие модули для работы с их API на cpan. Если найдутся — тогда работаем, если нет — используем те, которые найдутся.

Ирония заключается в том, что для Яндекс.Фоток нет соответствующего модуля на cpan, но зато есть прекрасная возможность добраться до «свободнолежащих» фоток, минуя авторизацию, которая, кстати, и провалилась в случае с PicasaWeb.

Нет модуля? Тогда читаем документацию по API и делаем все так, как там. Самый большой плюс API Яндекс.Фоток заключается в том, что это Atom, для работы с которым в перле все готово.
Как оказалось, настолько готово, что ничего специального не требуется — и без того все понятно и красиво получается. Я имею ввиду Atompub::Client. =)»

Но, по порядку.

В документации пишут, что перед началом работы с API, надо получить сервисный документ, в котором будут лежать ссылки для доступа к альбомам и фотографиям, т.е. две отдельные ссылки. Получаем:

    my $atom_client = Atompub::Client->new();

my $service = $atom_client->getService('http://api-fotki.yandex.ru/api/users/{me}'); unless ( $service ) { # Не сложился запрос $log->error('Cant request service document'); return; }

# Уфф.. все получилось, запоминаем: my ( $workspace ) = $service->workspaces; my @collections = $workspace->collections;

my $album_link = $collections[0]->href; my $photo_link = $collections[1]->href;

На самом деле, эти две ссылки — величины постоянные, но Яндекс.Фотки предупреждают, что ничего постоянного в этом мире нет (в т.ч. и Яндекса ;-), и что, на всякий случай, получить сервисный документ надо. Ну ладно, получили. Дальше.

Теперь есть возможность получить список всех фоток, которые открыты для общего доступа. Список тех фотографий, которые закрыты от просмотра лицам, не авторизованным на сайте, можно получить, если авторизоваться в API. В данном конкретном случае такой задачи у меня не стояло, но всем желающим могу посоветовать поискать на гитхабе Fuse::YandexFotki, в котором эта функция уже реализована одним хорошим человеком =)».

А мне-то надо сейчас всего лишь получить фотки. Вот так:

    my $feed = $atom_client->getFeed( $photo_link );

unless ( $feed ) { # Не получилось выполнить запрос $log->error('Cant get photo'); return; }

my @photo; for my $entry ( $feed->entries ) { push @photo, { summary => $entry->summary || '', uri => $entry->content->src, }; }

return @photo;

Как видно из примера, этот процесс так же прост, как … хм… Ну не знаю, в общем, прост. =)

Делаем выводы. Современное состояние языка (я имею ввиду Perl) позволяет легко решать любые задачи стандартными методами, не собирая отдельные классы для работы с API, как это было несколько лет назад, например, когда рождались всяческие Net::Google и прочее.

Хотя, конечно, я немного слукавил — таки для фоток у меня отдельная модель ;-)».

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

Продолжается регистрация на конференцию Perl Mova + YAPC::Russia, которая состоится в Киеве 12—14 июня.

На сегодня список докладов выглядит так:

Самое время зарегистрироваться и подать заявку на доклад!

Хабрахабр: Метки / perl: Блог компании DevConf / DEVCONF 2010 — 17 мая программа опубликована — приезжают авторы PHP, MySQL, Perl, Ruby, Sphinx

image 17 мая в Москве в выставочном центре Крокус-Экспо пройдет конференция для профессиональных web-разработчиков DEVCONF 2010, которая будет поделена на секции, связанные с определенным языком программирования. На конференцию приглашены всемирно известные гуру MySQL, PostgreSQL, PHP, Perl, Python, Ruby и Javascript.

Премиум спонсором DEVCONF 2010 выступил: Microsoft.

В этом году приедут:

  • Ilia Alshanetsky — Core PHP Developer
  • Michael Widenius Co-Founder of MySQL AB Author of the MySQL Server and MariaDB
  • Yehuda Katz — ведущий разработчик Rails 3, Merb, DataMapper и jQuery.
  • Евгений Чигиринский – Lead Senior Software Development Engineer в команде MSN
  • Stephen Walther is a member of the Microsoft ASP.NET team in Redmond, Washington.
  • Алексей Рыбак, Badoo
  • Piers Cawley BBC, UK Perl 6
  • Карл Мэсак (Carl Mäsak) Sweden
  • Иван Сагалаев Яндекс

Не пропусти тусовку — будет более 1 200 веб-разработчиков.
Проголосуй за свой любимый язык программирования!
devconf.ru/register/

В рамках DEVConf будет проводиться бесплатный WebCamp — 19 мая
devconf.ru/webcamp/

Подробная программа конференции на 17 мая:

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

Мужской способ возвращать результаты из функции sub getMessages{ local($mop,$pg,$all)=@_; if(!&db_query("select insurance_faq_main.id,date_format(insurance_faq_main.date,'%d.%m.%Y'),insurance_faq_main.name,insurance_faq_main.email,insurance_faq_main.www,insurance_faq_main.city,insurance_faq_main.message,insurance_faq_main.ip,answer from insurance_faq_main, insurance_faq_ans where insurance_faq_ans.idm=insurance_faq_main.id order by id desc limit ".$pg*$mop.",$mop")) {$body .= $db_message; return -1} $id; @date; @name; @email; @www; @city; @msg; @ip; @answer; for(local $i=0;defined($rows->[$i]);$i++) { $id[$i]=$rows->[$i]->[0]; $date[$i]=$rows->[$i]->[1]; $name[$i]=$rows->[$i]->[2]; $email[$i]=$rows->[$i]->[3]; $www[$i]=$rows->[$i]->[4]; $city[$i]=$rows->[$i]->[5]; $msg[$i]=$rows->[$i]->[6]; $ip[$i]=$rows->[$i]->[7]; $answer[$i]=$rows->[$i]->[8]; } return $i; }

Воскресенье, 25-е апреля

http://juick.com/freefd/673934

логику людей, что пишут внутри функции if ($session->error) { return {error => "true"}; exit 1; } мне никогда не понять. cpan такой cpan.

Суббота, 24-е апреля

Shoor/нал: Поклеил панорамы

Поставил hugin под убунтой — стало лучше: в отличие от мандривы, требуется меньше телодвижений: почти не надо елозить мышью — всю работу по поиску ключевых точек (ну или почти всю) autopano-sift выполняет самостоятельно — в мандриве требовалось указать хотя бы одну пару (а лучше три) для всех соседних картинок. На больших панорамах, по десятку снимков, это утомляло. Особенно когда вместо мыши использовался ноутбучный тачпад..

Закат на Александровской сопке

Попутно написал на перле quick and dirty добытчик превьюшек из RSS-потока. Было, в общем-то, три варианта:

  1. Аккуратно разобрать полученный XML (на CPAN есть всякие модули).
  2. Взять с полки книжку, вспомнить про XSLT и сделать именно на нём. Можно даже без перла.
  3. Тупо выдрать нужное регекспами.
Тупо выдрал:
while ( $content =~ s{<item>(.+?)</item>}{}s ) {
    local $_ = $1;
    my ( $title ) = m{<title>(.+?)( / .+?)?</title>};
    my ( $link  ) = m{<link>(.+?)</link>};
    my ( $src   ) = m{<media:thumbnail\s+url="(.+?)"};

    print qq{<a href="$link"><img src="$src" alt="$title" title="$title"></a> };
}
Выдаёт такой список:

Закат на Александровской сопке Александровская сопка. Перед закатом Вид с Александровской сопки в сторону Миасса Вид с Александровской сопки на Златоуст и Таганай Скалы на Александровской сопке

Чую, что надо было всё-таки каким-нибудь из первых двух методов пользоваться, но поленился читать мануалы. Стыд и позор.

Пятница, 23-е апреля

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

Много лет назад, когда еще не было интернета, я слышал историю о том, что то ли американские, то ли советские ученые потеряли спутник из-за опечатки в программе: вместо запятой стояла точка (или точка с запятой, или вообще не было запятой).

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

После переделки скрипта (тех же времен, что и история со спутником) вместо точки с запятой оказалась запятая:

my $user = new XML::LibXML::Element('user'),
$messagelist->appendChild($user);

При компилировании крамола не выявлялась, но при выполнении возникала ошибка, что узел еще не узел:

XML::LibXML::Node::appendChild() -- nNode is not a blessed SV reference

Shoor/нал: Твоя моя не понимай

Bootylicious ругается на конфигурационный файл, если встретит в нём не-ASCII символы (то есть, с кодами больше 127), хочет, чтобы они были представлены в виде \uXXXX. Плохо :-(

Да и настройки он ищёт в bootylicious.json, а не в bootylicious.conf, как написано в документации.

Записки программиста — Perl: Параллельная обработка данных в Perl

Решил выложить небольшую заготовку для скрипта, обрабатывающего данные с помощью нескольких дочерних процессов. Мне уже приходилось пару раз ее использовать, может и Вам пригодится. Идея следующая. Есть много дочерних процессов, предназначенных непосредственно для обработки данных, и родительский процесс, который собственно создает дочерние, если нужно – синхронизирует их, и так далее. Для начала – код родителя, parent.pl: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768#!/usr/bin/perl # [...]

http://juick.com/teferi/669623

Жуйк, какой в стандартной поставке перла есть модуль для разбора конфигов? Тоесть чтобы гарантировано — есть перл — есть модуль.

Четверг, 22-е апреля

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

Страх преодолен. Мы официально используем вызовы Perl-функций из XSLT, преобразуемого из перла.

sub register_functions {
    my $xslt = shift || 'XML::LibXSLT';
    my $ns = 'http://whoyougle.com';
    $xslt->register_function($ns, 'uri-encode',
         \&URI::Escape::uri_escape_utf8);
    $xslt->register_function($ns, 'js-encode', 
         \&escapeJS);
    $xslt->register_function($ns, 'declension',
         \&Lingua::RU::Numeric::Declension::numdecl);
}

Соответственно, в нужных местах теперь достаточно написать

<a href="{w:uri-encode(@href)}">
    <xsl:value-of select="text()"/>
</a>

Функция, склоняющая слова после числительных, написанная на XSLT, осталась только в архивах :-)

Теперь хочется сравнить производительность чисто-XSLT-решения, решения, когда перл готовит все данные сам, и случая, когда из XSLT мы вызываем функции на Perl.

Кстати, оказалось, что libxslt регистрирует все функции в одной куче, вплоть до того, что их возможно регистрировать не на инстансе парсера (созданном вызовом new XML::LibXSLT), а непосредственно через функцию модуля:

XML::LibXSLT->register_funcion(...);

Perl6.ru: Апрельский релиз Rakudo — «Moscow»

28-й релиз Rakudo Perl 6 вышел под кодовым названием «Moscow». Решение о названии, в частности, принято из-за того, что в апреле в Москву приезжал Джонатан Вортингтон, один из разработчиков Rakudo. Сейчас компилятор проходит 30 931 тест из спецификации, что составляет около 79% их общего числа.

Сообщество ru_perl в LiveJournal: Утечка памяти в Math::GSL

Использую модуль Math::GSL::Fit.
В цикле вызываю функцию расчета коэффициентов линейной регрессии.
Диспетчер задач показывает постоянный рост потребляемой приложением памяти.

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

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

Среда, 21-е апреля

On Perl — блог о языке программирования Perl и его сообществе: Libapreq2 + &lt;SUP&gt; + MSIE = Fail

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

Оказалось, что это происходит только с MSIE, и именно с теми ссылками, которые находятся в блогах на livejournal.com. В строке запроса (QUERY_STRING) в таких ссылках обычно четыре параметра — два текстовых и два числовых:

http://whoyougle.ru/place/distance/?from=%D0%9F%D0%B0%D1%80%D0%B8%D0%B6&to=%D0%91%D0%B0%D1%80%D1%81%D0%B5%D0%BB%D0%BE%D0%BD%D0%B0&from_which=498817&to_which=1819729

Значения параметров from и to — то, что пользователь вводил в полях ввода, а from_which и to_which уточняют запрос, выбирая из нескольких одноименных названий одно конкретное. (В общем-то, несколько избыточно, и от первых двух параметров мы уже отказались, но суть не в этом.)

После перехода по ссылке в адресной строке вместо URI-escaped-последовательности оказывались русские буквы, и первое подозрение было — MSIE не очень хорошо работает с такими адресами и передает на сервер что-то искаженное.

MSIE, однако, хорош тем, что щелкает при загрузке страницы, и вместо одного щелчка при переходе по ссылке было два. Оказалось, что товарищи жжсты подменяли ссылку и превращали ее в ссылку на их бесконечно хитрый редиректер (который сначала загружал ту же страницу ЖЖ, а потом делал редирект):

http://community.livejournal.com/ru_travel/14519597.html?thread=168965421&dr_log=-1&linkout=http%3A//whoyougle.ru/place/distance/%3Ffrom%3D%25D0%259F%25D0%25B0%25D1%2580%25D0%25B8%25D0%25B6%26to%3D%25D0%2591%25D0%25B0%25D1%2580%25D1%2581%25D0%25B5%25D0%25BB%25D0%25BE%25D0%25BD%25D0%25B0%26from_which%3D498817%26to_which%3D1819729

После этого происходил переход на адрес, в котором вместо from=%D0%9F%D0%B0%D1%80%D0%B8%D0%B6 оказывалась неэкранированная последовательность байт, эквивалентная запросу from=%c1%e0%f0%f1%e5%eb%ee%ed%e0. А это уже не изначальный UTF-8, а почему-то голый Windows-1251.

Реальные же непонятки возникли, когда оказалось, что оставшиеся параметры from_which и to_which были вообще не видны на сервере. Но такого же не может быть! В переменной $ENV{QUERY_STRING} строка была вся и целиком.

Мы пользуемся библиотекой libapreq2 для разбора параметров, чтения кук и загрузки файлов. Perl-модули Apache2::Request и др. предоставляют интерфейс, аналогичный традиционному CGI.pm, и в нехохошем до сих пор замечены не были.

А тут в списке параметров, возвращаемых вызовом $req->param(), оказывались только те, которые стояли в строке запроса до первой пары со значением в кодировке Windows-1251.

Круто, лезем с Сергеем в код libapreq2 (предварительно обновившись до последней версии, но неадекватное поведение осталось).

Сказать, что я был удивлен, — ничего не сказать. Libapreq2 при разборе строки делает бешеное число действий для того, чтобы распознать кодировку запроса. Казалось бы, зачем она это делает, если Apache2::Request все равно в итоге отдает октеты?

Алгоритм выявления кодировки (см. файл util.c) такой:

  1. изначально ожидается ASCII. Если нет, то
  2. предполагаем UTF-8. Если нет, то
  3. предполагаем Latin-1. Если нет управляющих символов, то
  4. устанавливаем CP1252.

Да-да, Latin-1 и CP1252. (Сразу видно, что писано моноглотами.) Функция, выполняющая эти эвристики, кстати, называется apreq_charset_divine. Divine — англ. гадать, предсказывать, пророчествовать.

Первый байт строки %c1%e0%f0%f1%e5%eb%ee%ed%e0 содержит два единичных старших бита, и функция-пророк считала его началом UTF-последовательности. Правда, на втором же байте понимало, что это не так, и... и в итоге функция apreq_parse_query_string (см. файл param.c) завершала работу:

s = apreq_param_decode(&param, pool, start, nlen, vlen);
if (s != APR_SUCCESS)
    return s;

apreq_param_tainted_on(param);
apreq_value_table_add(&param->v, t);

Ни сама пара, в которой содержалась строка в кодировке Windows-1251, ни все последующие не попадали в таблицу параметров строки запроса.

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

s = apreq_param_decode(&param, pool, start, nlen, vlen);
if (s == APR_SUCCESS) {
    apreq_param_tainted_on(param);
    apreq_value_table_add(&param->v, t);
}

Собираем libapreq2, подменяем libapreq.so, и — вуаля! — видим значения всех параметров после тех, что проигнорировали.

P. S. В исходниках есть моноглотские определения типа

enum   apreq_charset_t { APREQ_CHARSET_ASCII = 0, APREQ_CHARSET_LATIN1 = 1, APREQ_CHARSET_CP1252 = 2, APREQ_CHARSET_UTF8 = 8 }

и самописаня функция apreq_cp1252_to_utf8, реализация которой напоминает мой код 2002 года :-)

koorchik's Perl blog: Тест на понимание Perl: Вопрос 4

Мета

DevConf

  • Конференция DevConf::Perl() 17-18 мая в Москве. Приходите!

Поиск

Участники

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

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

По-другому

Приборы

Rambler's Top100