Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > анти-ошибка, и время выполнения скрипта


Автор: xXvladXx 3.5.2008, 16:44
1)
есть функция
Цитата

sub get{
my $host = "host";
my $port = "80";
my ($path,$cookie,$type,$post)=@_;
my $socket = IO::Socket::INET->new("$host:$port");
unless ($socket) {die "can't connect to HTTP server on $host:$port: $!"} # вот тут гадина вылетает если die заменяю на
                                                                         #принт то вылетает
$socket->autoflush(1);                                                  #вот тут

my $header="$type $path HTTP/1.0\r\n".
    "Accept: */*\r\n".
    "Accept-Language: ru\r\n".
    "Content-Type: application/x-www-form-urlencoded\r\n".
    "Proxy-Connection: Keep-Alive\r\n".
    "Host: vkontakte.ru\r\n";
if($post){
$header.="Content-Length: ".length($post)."\r\n";
}
$header.="$cookie\r\n".
  "$post".
  "\r\n";
print $socket  "$header";
my @rz = <$socket>;
close $socket;
return join("\n",@rz);
}

как сделать что при ошибки он ждал 1 сек и начинал эту функцию с начала
2)
как засечь время выполнения скрипта 
секундомер, и наручные часы не катят:(

Автор: ramus 3.5.2008, 17:12
1) Обычно пишут так

Код

my $socket = IO::Socket::INET->new("$host:$port") 
  or die "can't connect to HTTP server on $host:$port: $!"} 


если ругается и вылетает, значит не смог соединиться. Надо смотреть что с сервером...

Чтобы ждал и не вылетал надо написать что то типа этого (я не проверял):
Код

use strict;
use IO::Socket;

my $host = "www.ru";
my $port = "80";

my $socket;
while ( ! ($socket = IO::Socket::INET->new("$host:$port") ) ) {
  # если попали сюда, значит не соединились
  print ("Not connected: $!\nSleep 5 sec\n");
  sleep 5;
}


а вообще по этому поводу есть ОЧЕНЬ хорошая книжка "Разработка сетевых программ на Perl" Линкольн Д. Штайн


2) ну тут совсем просто
Код

my ($t1,$t2);
# Запоминаем время начала работы
$t1=time;

#тут что то делаем, например спим
sleep 5;

# Запоминаем время окончания работы
$t2=time;

printf "Время работы %d sec", $t2-$t1;

Автор: FooBar 3.5.2008, 18:02
xXvladXx, 
а чем вам LWP::UserAgent не нравится?

Автор: xXvladXx 3.5.2008, 18:06
я там с куками не разобрался и сразу пакет составлять легче)
и сокеты быстрей)

Автор: xXvladXx 3.5.2008, 18:30
и еще вопрос как сделать задержку на 0,2сек???

Автор: ramus 3.5.2008, 18:43
Цитата

и еще вопрос как сделать задержку на 0,2сек??? 


Код

use Time::HiRes qw(sleep);

printf " %02d:%02d:%02d\n", sub{($_[2],$_[1], $_[0])}->(localtime);

sleep(0.2);
sleep(0.2);
sleep(0.2);
sleep(0.2);
sleep(0.2);

printf " %02d:%02d:%02d  5 x 0.2 = 1 sec\n", sub{($_[2],$_[1], $_[0])}->(localtime);


Автор: FooBar 3.5.2008, 18:51
select(undef, undef, undef, 0.2);  sleep понимает только целые значения

Автор: ramus 3.5.2008, 19:06
Цитата

sleep понимает только целые значения 


стандартный sleep действительно не понимает
sleep из стандартного модуля Time::HiRes понимает вещественные значения.
строка 
Код

use Time::HiRes qw(sleep)

говорит заменить стандартный на sleep из модуля

Кстати некоторые системы (я не встречал, но в книжках написано) не поддерживают select с 4 аргументами

Автор: FooBar 3.5.2008, 19:09
ramus, 
извиняюсь, не обратил внимание что вы экспортировали sleep из модуля

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)