Как добавить модуль Xml::xpath в Activeperl?

  • Автор темы Satell
  • Дата начала
S

Satell

#1
Поставил Active Perl 5.8.8 под винды, при выполнении скрипта ошибка
Can't locate XML::XPath, нету такого модуля
скачал его со span.org, как его установить в мой дистрибутив, просто скопировать в папку XML или нет?
и оттуда ли я его скачал?

я просто скопировал модуль в папку XML, прога выдаёт ошибку Undefined subroutine &main::xmlescape line32

тут такого модуля нет
http://ppm.activestate.com/PPMPackages/zips/5xx-builds-only/

Код:
#!/usr/bin/perl -w -Ilib

use strict;

# модули для получения информации из XML и доступа к
# веб-ресурсам, соответственно
use XML::XPath;
use LWP::UserAgent;

# верхняя и нижняя части страницы
#require "./page-template.pl";

# библиотека функций. например для обработки полей присланной
# формы
#require "./xml-lib.pl";

print "Content-Type: text/html;charset=utf-8\n\n";

#print &header;

# обработка полей формы
#my %params = &parse_form;


#my $host = $params {'host'};
#my $query = $params {'query'};

my $host='riabinoviy.info';
my $query='шансон';

#замена символов на ескейп последовательности, возможно библа xml встала неправильно
my $query_esc = xmlescape($query);
my $host_esc = xmlescape($host);

#тут узнать что делает
$host =~ s[^http://|www\.][];

# готовим запрос
my $ua = LWP::UserAgent->new;
$ua->agent("Bond, James Bond/0.07");

my $exit = 1;

$exit = 0 if $ENV{'REQUEST_METHOD'} eq 'POST';

my $reqid = undef;
my $page = 0;
my $found = 0;
my $pages = 20;

print "<table width='100%'><tr><td width='16%'/><td>";

# мы должны получить место сервера в выдаче по некому запросу.
# делаем запрос по десять ссылок на страницу и запрашиваем 50
# страниц. при нахождении сервера останавливаемся и выдаем его
# место в выдаче
while (not $exit and $page < $pages and $host)
{
my $reqid_tag = '';
$reqid_tag = "	<reqid>$reqid</reqid>\n\n"
if (defined $reqid and $reqid);

# XML запрос
my $doc = <<DOC;
<?xml version='1.0' encoding='utf-8'?>
<request>
<query>$query_esc</query>
<page>$page</page>
$reqid_tag
<maxpassages>0</maxpassages>
<groupings>
<groupby attr='d' mode='deep' groups-on-page='10' docs-in-group='1' curcateg='-1'/>
</groupings>
</request>
DOC

my $req = HTTP::Request -> new
# ( POST => 'http://xmlsearch.yandex.ru/cgi-bin/xmlsearch.pl' );
( POST => 'http://xmlsearch.yandex.ru/cgi-bin/xmlsearch.pl');
$req -> content_type ('application/xml');
$req -> content ("$doc");

# отправляем запрос
my $response = $ua -> request ($req);

if ( $response->is_success )
{
#print $response -> content;

my $doc = XML::XPath -> new ( xml => $response -> content );

# пробуем получить ошибку
my $error = $doc -> findvalue ('/yandexsearch/response/error');
if ("$error")
{
print "Возникла следующая ошибка: ", $error, "<br/>\n";
$exit = 1;
last;
}

$reqid = $doc -> findvalue ('/yandexsearch/response/reqid');

my $pos = 1;
my @nodes = $doc -> findnodes ('/yandexsearch/response/results/grouping/group/doc/url');
foreach ( @nodes ) 
{
# если URL начинается с имени хоста, выходим из цикла
if ( $_ -> string_value =~ m/^http:\/\/(www\.)?$host/i )
{
$found = $pos + $page * 10;
$exit = 1;
last;
}

$pos++;
}

$page++;
}

else
{
print "внутренняя ошибка сервера\n";
$exit = 1;
}

}

# если что-то найдено, то выводим результат 

if ($found)
{
print "<p>сайт «$host» находится на месте № $found по запросу «$query»</p><p>Попробуйте узнать позицию другого сайта!</p><br/>\n";
}
elsif (defined $host and $host)
{
print "<p>сайт «$host» находится далее, чем на ". $pages*10 ." месте в выдаче «Яндекса» по запросу «$query»</p><p>Попробуйте узнать позицию другого сайта!</p><br/>\n";
}
else
{
print "<p>Узнайте позицию сайта в выдаче «Яндекса» по запросу!</p>";
}

print "</td></tr></table>";

# выводим форму с запросом.
print <<FORM;
<form method='POST' accept-charset='utf-8'>
<table width='100%'>
<tr>
<td width="16\%"/>
<td width="75\%">
<table>
<tr>
<td><label for='query'>Запрос:</label></td>
<td><input type='text' name='query' id='query' value='$query_esc'/>  Пример: волшебные травы</td>
</tr>
<tr>
<td><label for='host'>?Имя сервера:</label></td>
<td><input type='text' name='host' id='query' value='$host_esc'/>  Пример: narcom.ru</td>
</tr>
<tr>
<td/>
<td><input type="submit" value="??скать!"/></td>
</tr>
</table>
</td>
<td width="9\%">
</tr>
</table>
</form>
FORM

# дописываем html
print &footer;
 
D

diff

#2
воспользуйтесь автоматической установкой
http://xpoint.ru/know-how/Perl/UstanovkaModuley
Менеджер пакетов ActivePerl

Дополнительно в ActivePerl имеется свой собственный менеджер пакетов. Он называется ppm и запускается командой path-to-perl\bin\ppm.bat. При запуске вываливается командная строка, в которой можно вводить, например, такие инструкции:

ppm> install Имя::Модуля
ppm> remove Имя::Модуля
ppm> help
...и т.д.


Модули устанавливаются из бинарных дистрибутивов с сайта ActivePerl (по запросу они скачиваются через Интернет, так что удобнее всего будет к нему подключиться перед запуском ppm).
 
V

Vovochka

#3
Если же ты хочешь установить модуль "вручную", тогда тебе придется скачать nmake и установить ее в папку с виндой.
Ну это в том случае, если ты не являешься счастливым обладателем Microsoft Visual Studio.

Дальше:
Распаковываем содержимое архива
Обычно, для быстроты, я имею заготовленный скрипт типа instal_pm.bat:
Код:
@ECHO OFF
call "%VS80COMNTOOLS%vsvars32.bat"
perl makefile.pl
nmake /nologo
nmake /nologo test
nmake /nologo install
pause
Поясню строчку call "%VS80COMNTOOLS%vsvars32.bat"
Здесь идет вызов скрипта, поставляемого с визуал студией, добовляющего в переменные окружения все что надо.
%VS80COMNTOOLS% - Это переменная окружения, установленная студией, определяет путь к своим инструментам.
Название зависит от версии студии (меняется лишь цифры в начале, так 80 - это 2005 студия)

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

+ Я ничего не могу сказать про gcc под виндой.