1. Наш канал codeby в telegram. Пишем об информационной безопасности, методах защиты информации, о программировании. Не пропускай новости с кодебай, будь в тренде ! Подробнее ...

    Скрыть объявление

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

Тема в разделе "Web - программирование", создана пользователем Satell, 2 янв 2008.

  1. Satell

    Satell Гость

    Репутация:
    0
    Поставил 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>сайт &laquo;$host&raquo; находится на месте № $found по запросу &laquo;$query&raquo;</p><p>Попробуйте узнать позицию другого сайта!</p><br/>\n";
    }
    elsif (defined $host and $host)
    {
    print "<p>сайт &laquo;$host&raquo; находится далее, чем на ". $pages*10 ." месте в выдаче &laquo;Яндекса&raquo; по запросу &laquo;$query&raquo;</p><p>Попробуйте узнать позицию другого сайта!</p><br/>\n";
    }
    else
    {
    print "<p>Узнайте позицию сайта в выдаче &laquo;Яндекса&raquo; по запросу!</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;
     
  2. diff

    diff Гость

    Репутация:
    0
    воспользуйтесь автоматической установкой
    http://xpoint.ru/know-how/Perl/UstanovkaModuley
     
  3. Vovochka

    Vovochka Гость

    Репутация:
    0
    Если же ты хочешь установить модуль "вручную", тогда тебе придется скачать 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 под виндой.
     
Загрузка...

Поделиться этой страницей