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


Автор: vechik 15.2.2010, 09:49
Есть такой код

Код

#!/usr/bin/perl -w
use strict;
#use warnings;
use diagnostics;
use DBI;
use CGI qw(:all);
#use CGI::Carp 'fatalsToBrowser';
print header( -charset => 'Windows-1251');
use Time::HiRes qw ( time ); # qw(gettimeofday tv_interval);
#$t1=time;

...

Если убираю комментарий из последней строки, то в логах получаю такую запись: Premature end of script headers.
Подозреваю, то на сервере используется версия Perl 5.8.8, а эти функции включены начиная с версии 5.10.1.
Может, кто посоветует, что делать?
А задача - подсчитать интервал времени в мс выполнения блока программы.

Автор: sir_nuf_nuf 15.2.2010, 10:08
Обычно это бывает когда переводы строки после заголовков HTTP забыли вывести.

Покажите весь скрипт

Автор: arto 15.2.2010, 10:23
а он у вас есть, Time::HiRes ?

Автор: mvsgt 15.2.2010, 12:56
Обычно такие ошибки исправляются, имитируя вызов скрипта сервером. Сделайте это, и узнаете что происходит. Конечно, можно и потелепатировать.

Автор: DurRandir 15.2.2010, 13:14
>>> use strict;
perldoc strict 

Это очень полезная прагма, прочитайте, что она НЕ даёт вам делать, и что из этого вы делаете в скрипте.

Автор: vechik 15.2.2010, 13:33
Цитата(vechik @ 15.2.2010,  09:49)
Есть такой код

#!/usr/bin/perl -w
use strict;
#use warnings;
use diagnostics;
use DBI;
use CGI qw(:all);
#use CGI::Carp 'fatalsToBrowser';
print header( -charset => 'Windows-1251');
use Time::HiRes qw ( time ); # qw(gettimeofday tv_interval);
#$t1=time;
...

Если убираю комментарий из последней строки, то в логах получаю такую запись: Premature end of script headers.
Подозреваю, то на сервере используется версия Perl 5.8.8, а эти функции включены начиная с версии 5.10.1.
Может, кто посоветует, что делать?
А задача - подсчитать интервал времени в мс выполнения блока программы.


Вот так получилось, но выдает секунды
...
my $result = eval{use Time::HiRes; my $t1=time;};
print "$result ------ $@";
...
А так
...
my $result = eval{use Time::HiRes; my ($s,$mks)=gettimeofday();};
print "$result ------ $@";
...
выдало 
------ Undefined subroutine &main::gettimeofday called at _index1.pl line 12. 

Автор: mvsgt 15.2.2010, 14:39
vechik, Вам уже намекали насчёт use strict. #$t1=time; есть, а my $t1; нет. И Вы упорно не хотите выполнить скрипт без браузера и апача, просто из командной строки?

Автор: vechik 16.2.2010, 12:56
Ошибку нашел. Функцию надо писать со всеми префиксами. А также отдельно объявить переменные для дальнейшего использования.
Вот правильный вариант:
...
Код

use Time::HiRes; 
my ($s,$mks)=(0,0);
my $result = eval{($s,$mks)=Time::HiRes::gettimeofday();};
print "<br>$s--$mks";
#
#  вычисляем блок (например, поиск в БД)
#
$result = eval{($s,$mks)=Time::HiRes::gettimeofday();};
print "<br>$s--$mks";

...

Совершенно непонятно, зачем нужны strict, warnings, diagnostics и даже eval, если почти всегда идет ошибка 500.
Как выводить все ошибки в браузер???

Автор: JackYF 16.2.2010, 13:27

M
JackYF
vechik, пользуйся кнопкой "Код".

Автор: mvsgt 16.2.2010, 13:29
vechik, надо хотя бы чуть-чуть перл подучить, а? 

Ну зачем Вы используете $result = eval{($s,$mks)=Time::HiRes::gettimeofday();}; ? Time::HiRes используется для вычисления точного времени, а eval замедляет его получение.
зачем strict - затем, чтобы в браузер шла ошибка 500, без strict ошибок будет меньше, но программа может начать работать неправильно.
Функцию можно писать с префиксами, можно без. В документации всё описано. Но с префиксами может и лучше.

Чтобы видеть ошибки, запускайте свои скрипты без браузера. 
Зачем Вы в браузер суёте неотлаженные скрипты? Во всяком случае в error_log должны быть сообщения об ошибках, которые не видны в браузере. Если компиляция скрипта не проходит, то fatalsToBrowser не проходит. Кстати, этот тэг есть в CGI.

Автор: RomanCh 16.2.2010, 23:16
Почему-то мне кажется что кто-то пытается заниматься чем-то стоя в гамаке... 
Может конечно я сыграю в капитана, но по-моему проблема решается "очень сложно", примерно вот так:
Код

use Time::HiRes qw/gettimeofday tv_interval/;

my $tStart = [gettimeofday];
sleep 1; # например ждём секунду

print "Elapsed " . tv_interval ( $tStart ) . "\n";

В cgi окружение надеюсь автор сам сможет впихнуть smile

Добавлено через 2 минуты и 42 секунды
PS топикстартер, попробуйте использовать команду man Time::HiRes или хотя бы посмотрите http://search.cpan.org/~jhi/Time-HiRes-1.9720/HiRes.pm.

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