On Sat, Apr 02, 2005 at 10:48:59PM +0400, Alexey Tourbin wrote: > On Sat, Mar 26, 2005 at 06:47:41PM +0300, Вячеслав Диконов wrote: > > # WARNING: failed to extract version > > at /home/slava/.tmp/perl-SOAP-Lite-buildroot/usr/lib/perl5/vendor_perl/Apache/SOAP.pm line 18: > > # $VERSION = sprintf("%d.%s", map {s/_//g; $_} q$Name: > > release-0_60-public $ =~ /-(\d+)_([\d_]+)/); > > # 'map' trapped by operation mask at (eval 3) line 1, <$fh> line 18. > > Это из-за Safe->reval в perl.prov. То есть map был отнесен > к "ненадежным" опкодам. То есть в `Porivdes: perl(Apache/SOAP.pm)' > и др. версии не будет. На это пока можно забить. А ведь это я разломал. Когда-то работало: http://lists.altlinux.ru/pipermail/devel/2001-May/002823.html То есть я решил отключить "entereval grepstart grepwhile mapstart mapwhile" до тех пор, пока что-нибудь не сломается, т.к. у меня локально на большом числе модулей ничего не сломалось. Кстати, по этой ссылке видна ещё одна (уже исправленная) ошибка: my $version = $safe->reval("$line; \$VERSION;"); Что если $line заканчивается комментарием? Правильно, $VERSION тоже окажется в комментарии. Правильно так: my $version = $safe->reval("$line\n; \$VERSION;"); Вернее, это наверное работало, т.к. $line заканчивался на \n. А когда я сделал chomp, то работать перестало. Ещё по нескольким граблям прошелся: if ((m/^=(head[12]|pod|over|item|for|begin)/) .. (m/^=(cut)/)) { next; } В некоторых файлах вся документация находится в самом низу и *не заканчивается* на =cut (что допустимо). Тогда действие этого условия перекидывается на следующий файл до ближайшего =cut. Сейчас так: next if /^=\w/ .. (/^=cut/ or eof); Прямо на это месте ещё одну граблю заметил: eof без скобок и eof() со скобками ведет себя совершенно по-разному (см. perldoc -f eof).