nataraj: (Default)
Читая книжку по внутренностям perl'а открыл для себя оператор `redo` который позволяет повторить выполнение блока кода. В случае если этот блок -- тело цикла, то цикл на следующую итерацию при этом не переходит:

my $i=0;
foreach (1,2,3)
{
  print $_,"\n";
  $i++;
  redo if $i<2;
}

печатает
1
1
2
3


PS так, постойте... В DW был же маркдаун... Куда делася? Не вижу как включить...
nataraj: (Default)
Заметка скорее для себя, чем...

Если быть более точным, то не ловим, а убеждаемся что они есть, и по возможности локализуем.
Значит есть такой модуль Memory::Usage Read more... )
nataraj: (Default)
Пытался поймать утечку памяти в своем перловом коде. Все-таки неприятно когда скрипт после суток работы вылетает с Out of memory.
Закончились поиски на уровне IO::Socket::SSL, и я понял что глубже копать мне как-то с наскоку слабо.

Пойду воспроизведу ошибку на sid'е (там более свежий нижележащий Net::SSLeay, который без танцев на squeeze в пакет не собирается) и напишу баг репорт.

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

Update:[personal profile] beldmit в fb посоветовал закрывать за собой сокет. Не помогло. Попробовал в sid'е, тоже течет...

А как вообще должен себя вести незакрытый сокет в перле?

Update2: Нашел на нижележащем уровне незакрытый тикет про Memory Leak. Подписался на апдейты, и пока на этом успокоюсь...

Update3: Не успокоился: https://rt.cpan.org/Ticket/Display.html?id=123520&results=db2511db9c9a60b56ff1d5ddb3b09c95
nataraj: (Default)
Scalar::Util
       dualvar NUM, STRING
           Returns a scalar that has the value NUM in a numeric context and the value STRING in a string context.

               $foo = dualvar 10, "Hello";
               $num = $foo + 2;                    # 12
               $str = $foo . " world";             # Hello world


Господи! Это каких же глюков можно наловить!

PS: Там еще в конце забавно: The weaken and isweak subroutines in this module and the patch to the core Perl were written in connection with the APress book ‘Tuomas J. Lukka’s Definitive Guide to Object-Oriented Programming in Perl’, to avoid explaining why certain things would have to be done in cumbersome ways.
nataraj: (Default)
Перловый скрипт с очень длинным циклом постепенно съедает доступную память... В памяти я вроде ничего не храню, все пишу в файлы. Все переменные пересоздаются заново в теле цикла. Даже файловые дискрипторы не храню, всякий раз открываю/закрываю... Тем ни менее память постепенно съедается и к утру наверное съестся вся... Что плохо для соседей...

Где она еще может естся? внутри глобальных переменных модулей? Попробовать занести внутрь цикла часть use'ов а в конце цикла сказать им "no"? Это поможет, если дело в этом?

Я конечно могу сохранить список в файл и пятьсот раз запустить этот скрипт с обработкой по сколько-то тысяч записей, это наверное спасет от утечки... Но как-то это как минимум не спортивно
nataraj: (Default)
Берем простой пример

use XML::LibXML;                                                                                                                                             
                                                                                                                                                             
my $xml = "<test some_attr='bbbbb'/>";                                                                                                                       
my $parser = XML::LibXML->new();                                                                                                                             
                                                                                                                                                             
my $doc = $parser->parse_string($xml);                                                                                                                       
print $doc->toString;

Выводит он все тоже самое, но атрибут в двойных кавычках....

Кто-нибудь что-нибудь осмысленное знает про сохранность кавычек при прогонке xml'я через libxml2 ? Это вообще возможно?

А то поменял скриптом в файле какую-то ерунду, а diff больше самого файла... Неаккуратненько...

perl

Dec. 2nd, 2010 06:52 pm
nataraj: (Default)
Если ненароком поймать undef в спиочный контекст а потом проверить истинность полученного, то оно оказывается истинно... список то не пустой!
nataraj: (Default)
Вчера на пару с коллегой раскопали антикварные перловые грабли:
Коллега написал демона который должен был висеть на заданном порту и отвечать... Не будучи демонизированным демон работал совершенно штатно, отвечая на тестовые запросы. Но будучи демонизированным работать отказывался ссылаясь на ошибку внутри utf8_heavy.pl. На этом этапе к работе приступил я, как наименее загруженный. Путем добавления тестового ввода была локализована строка которая генерила ошибку. Строкой оказался банальный tr///; только с русскими, и как следствие, уникодными буквами внутри... В результате более подробного гугления выяснилось что у перла 5.8.8 есть особенность реализации, которая приводит к таким ошибкам при выполнении операции tr/// с уникодными буквами, в случае если процесс работает в thread'е
http://rt.perl.org/rt3/Public/Bug/Display.html?id=41124
По результатам Net::Daemon'у при создании было дополнительно сказано mode=>'fork' и все заработало.
Прекрасные антикварные грабли!
nataraj: (Default)
Надо сделать копию объекта, чтобы не поганить оригинал изменениями...

Можно сделать
my $copy = {%{$orig}};
но это как-то сильно wirte-only, даже если комментарием сопроводить...

Нет ли случайно какой-то спецфункции позволяющией клонировать объект, о которой я не знаю?
Чтобы можно было сказать что-то вроде
my $copy = clone $orig;
nataraj: (Бритый небритый)
Хочу очень простой вещи: разделить строку на части, при этом разделители многосимвольные, похожи, но отличаются на пару символов друг от друга... Хочется нечто вроде

my $s="111 =aa= 222 =bb= 333 =cc= 444";
print join "\n", split(/=(aa|bb|cc)=/, $s);

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

Теоретически можно написать split /=aa=|=bb=|=cc=/, $s
и тогда все будет. Но это только в примере выглядит коротко... В жизни так писать не хотелось бы.

Научить сплит не включать зоны группировки в результат кажется невозможно... Можно ли как-то без круглых скобок намекнуть регекспу что знак равенства уже не часть альтернативы, а следующий за альтернативой символ?
nataraj: (Бритый небритый)
Разобрался как XSD-валидировать XML'ки через перл... Read more... )

Profile

nataraj: (Default)
Swami Dhyan Nataraj

July 2024

S M T W T F S
 123456
789 10111213
14151617181920
21222324252627
28293031   

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated May. 25th, 2025 01:35 am
Powered by Dreamwidth Studios
OSZAR »