доброе время суток!
ОС: 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
что может быть не так на этой системе: несовместимость библиотеки и перла, сам перл, неверное использование мной этой библиотеки или что-то другое?