Помощник
Здравствуйте, гость ( Вход | Регистрация )
|
|
2:01:2008, 11:48
|
|
Новенький ![]() Группа: Программист Сообщений: 26 Регистрация: 28:06:2007 Пользователь №: 11 610 Репутация: 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>сайт «$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; |
|
Сообщение
#1
|
|
![]() |
|
|
6:01:2008, 23:55
|
|
Новенький ![]() Группа: Программист Сообщений: 16 Регистрация: 6:01:2008 Пользователь №: 14 623 Специализация: web-programming Репутация: 0
|
воспользуйтесь автоматической установкой
http://xpoint.ru/know-how/Perl/UstanovkaModuley Цитата Менеджер пакетов ActivePerl
Дополнительно в ActivePerl имеется свой собственный менеджер пакетов. Он называется ppm и запускается командой path-to-perl\bin\ppm.bat. При запуске вываливается командная строка, в которой можно вводить, например, такие инструкции: ppm> install Имя::Модуля ppm> remove Имя::Модуля ppm> help ...и т.д. Модули устанавливаются из бинарных дистрибутивов с сайта ActivePerl (по запросу они скачиваются через Интернет, так что удобнее всего будет к нему подключиться перед запуском ppm). |
|
Сообщение
#2
|
|
|
|
10:01:2008, 00:34
|
|
Продвинутый ![]() ![]() Группа: Программист Сообщений: 198 Регистрация: 4:08:2006 Из: Vladivostok.pm Пользователь №: 5 749 Специализация: Perl, Web Репутация: 4
|
Если же ты хочешь установить модуль "вручную", тогда тебе придется скачать 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 под виндой. |
|
Сообщение
#3
|
|
![]() |
|
Текстовая версия | Сейчас: 17:05:2008 - 07:17 |