LINUX.ORG.RU

ошибки perl при работе с libxml


0

0

доброе время суток!

ОС: Debian (версию не знаю); ядро: 2.6.18-6-686; perl 5.8.8; libxml2 2.6.27.dfsg-2; XML::LibXML 1.65-1

при парсинге документа perl умирает без вывода каких-либо ошибок. результат работы cgi скрипта hmtl текст о 500 ошибке. никаких заголовков страницы. error.log апача пишет: Premature end of script headers: admin.cgi

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

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

код (частично) внутри метода (метод возвращает значение переменной $version), где выявлен вылет скрипта:

my $version = 1;

my @files;

# ...

my $mak = $dom->parse_balanced_chunk($data); # $data - кусок валидного xml

my $files = $mak->find('files')->shift;

# xml построен так, что условие выполняется

if ($files) {

# die 'stop'; # выводит

push @files, $_->find('path')->string_value foreach (@{$files->findnodes('file')});

# die 'stop'; # не выводит (при условии, конечно, что первого die нет) и дальше этого условия не проходит. выдается текст о 500 ошибке

}

но если заменить действия в условии на (по сути тоже самое)

foreach (@{$files->findnodes('file')}) {

my ($path_el, $path);

$path_el = $_->find('path');

$path = $path_el->string_value;

push @files, $path;

}

# различные действия, определение $version

return $version;

то условие проходится. но! проходится только в том случае перед return добавить две строки:

my $str;

$str = 'foo';

строки вообще никак не связаны с чем-либо в коде. как они могут влиять на скрипт не понимаю. без этих строк die не срабатывает уже после $path_el = $_->find('path');, хотя до срабатывает. с этими строками срабатывает и после. метод возвращает значение, скрипт идет дальше и вылетает при следующей похожей ситуации. есть еще замечания по поводу этих строк в различных вариантах:

1.

my $str;

$str = 'foo';

# die 'stop'; # срабатывает

# die $str; # не срабатывает. 500 ошибка

2.

my $str = 'foo'; # вылетает 500 ошибка

3.

my $str;

$str = $version; # вылетает 500 ошибка

скрипты без проблем работают на системах:

1. Windows XP, XML::LibXML 1.64 - 1.66, perl 5.8.8

2. FreeBSD 7.0, XMl::LibXML 1.66, perl 5.8.8

что может быть не так на этой системе: несовместимость библиотеки и перла, сам перл, неверное использование мной этой библиотеки или что-то другое?

anonymous

Прежде чем дальше ломать голову, лучше всё таки обновить все пакеты, вовлечённые в процесс.

theSoul ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.