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


Автор: VladimirAlexeev 24.1.2009, 19:34
Установил IndigoPerl.
Создаю файл следующего содержания
Код

#!perl -w
print "My test!";

Запускаю через браузер, ничего не выводится.
Беру пример
Код

#!perl -w
#use CGI::Carp 'fatalsToBrowser';     # Необходимы
use warnings;                                  # для отладки
#use strict;                                         # скриптов
use CGI;
my $q = new CGI;
print $q->header(-type => 'text/html', -charset => 'windows-1251' ), $q->start_html( "Мой PERL!" );
print "My test!";
print $q->end_html;

Выводиться на экран My test.
Вопрос №1
Что обязетально нужно выводить шапку через CGI объект (или просто выводить еще-что, кроме нужной мне информации), чтобы увидеть хоть какой-то результат?
Вопрос №2
При допущении любой ошибки в скрипте, браузер выдает Ошибку 500. При этом само диагностическое сообщение записывается в error.log апача.
Так вот можно ли как сделать вывод ошибок в браузер (как в PHP)?

Автор: nitr 24.1.2009, 22:00
Цитата(VladimirAlexeev @  24.1.2009,  19:34 Найти цитируемый пост)
Вопрос №1
Что обязетально нужно выводить шапку через CGI объект (или просто выводить еще-что, кроме нужной мне информации), чтобы увидеть хоть какой-то результат?

возьмите, пожалуйста, книгу и прочтите про CGI (вы удивитесь, что это не Perl ;) ), и почему обязательно "выводить ещё-что, кроме нужной вам информации"! Или может погуглить, это совсем обширный вопрос и писать (а скорее всего просто пересказывать) очень много, например, можете воспользоваться википедией.

Цитата(VladimirAlexeev @  24.1.2009,  19:34 Найти цитируемый пост)
Вопрос №2
При допущении любой ошибки в скрипте, браузер выдает Ошибку 500. При этом само диагностическое сообщение записывается в error.log апача.Так вот можно ли как сделать вывод ошибок в браузер (как в PHP)?

А в php есть обработка ошибки 500? Она возникает в тех случаях, когда в приципе ошибка или с запуском скрипта, или ещё какие-то, но поэтому и не может скрипт обработать, ошибка до скрипта.
В частных случаях как раз и используют:
use CGI::Carp 'fatalsToBrowser';
например, допустим ошибку в вашем скрипте:
Код
#!perl
use CGI::Carp 'fatalsToBrowser';     # Необходимы
use warnings;                                  # для отладки
use strict;                                         # скриптов
use CGI;

$q = new CGI; #если не заметили убрал my
print $q->header(-type => 'text/html', -charset => 'windows-1251' ), $q->start_html( "Мой PERL!" );
print "My test!";


P.S.: -w и use warnings; практически одно и тоже, но считается что использование последнего рекомендовано (сейчас).
И вот про то что такое Ошибка 500 (эту ошибку в пхп вы тоже будете смотреть в логах Апачи) гугль вывел:
http://dualhost.ru/faq/help_403.php
http://www.yutex.ru/help_error.php#500

Автор: VladimirAlexeev 24.1.2009, 23:28
Цитата(nitr @  24.1.2009,  22:00 Найти цитируемый пост)
А в php есть обработка ошибки 500? Она возникает в тех случаях, когда в приципе ошибка или с запуском скрипта, или ещё какие-то, но поэтому и не может скрипт обработать, ошибка до скрипта.

Но если, допустим, поставлю квадратные скобки, там где должны быть круглые, то мне В БРАУЗЕР выведется сообщение. А не в лог! И никакой ошибки 500.
А тут малейшая опечатка  и все! 500 и лезь в лог (

Ладно, качаю ща мануал, может просветит...

Автор: nitr 25.1.2009, 00:53
VladimirAlexeev, вы не правы!
В пхп нет обработки 500 ошибки, то что вы про скобки э то синтаксис, зачем спорить ни о чём? Вы посмотрели сылки, там же по-русски написано - Ошибка 500 это "ошибка сервера".
use CGI::Carp 'fatalsToBrowser'; вам в первое время поможет. Посмотрите пример что я привел. В нём мы тоже поставили "какие-то другие скобки", а конкретнее убрали две буквы "m" и "y" smile . 

Чтобы получить 500 ошибку в пхп, как вариант - найдите и удалите php.ini. Ещё можно изменить права на исполнение на скрипт.php. и придется вам тоже лезть в логи Апача. И ничего он не выведет вам, а скажет 500.


P.S.: VladimirAlexeev, хватит сравнивать PHP и Perl, вы так точно не научитесь Perl'у, в принципе обратное тоже иногда закономерно ;) Прочтите пару книг, это для первого времени достаточно, да и самое главное не ленитесь понимать, а знание пхп отбросьте на время изучения.


Вот пример проще:
Код
#!perl
use CGI::Carp 'fatalsToBrowser';
use warnings;
use strict;

print $test;

Ошибку покажет в браузере, можно сказать синтаксическая ошибка.
Такое:
Код
#!perl
use CGI::Carp 'fatalsToBrowser';
use warnings;
use strict;

print 'My test';

Уже покажет 500. Т.к. синтаксис верный, но у вас не скрипт CGI. Если бы вы знали что это CGI, то поняли, что здесь мы не передали заголовок.
Т.е. этот:
Код
#!perl
use CGI::Carp 'fatalsToBrowser';
use warnings;
use strict;

print "Content-type: text/html\n\n";
print 'My test';

Автор: tolkien 25.1.2009, 04:40
И еще учтите что PHP создан спец. для веба, а PERL создан для администраторов сетей. Отсюда такое разное поведение на ошибку 500 как выше написано.Т.е в php предусмотренные разные спец обработки не предвиденных ситуаций, чтобы пользователь поличл максимально полезной информации на устранение ошибки. В PERL для этого вам надо самим что то делать. Например подключать разные модули или  что-нибудь предопределять. Работы от вас в PERL требуется больше. Например чтобы производительность вашего скрипта была сравнима с php нужно обязательно использовать mod_perl или fastcgi. Т.е вам придется дополнительно изучать выше указанные модули и их интерфейсы. Кроме того не каждый хост даст еще возможность использовать mod_perl или fastcgi. В PHP ничего этого не надо. Он сделан уже так что вам ненужно заниматься самим кроме написания самой программы еще и ее оптимизацией.
 

Автор: VladimirAlexeev 25.1.2009, 11:36
Блин, да знаю я ошибки сервера =). Потому меня это напрягает (удивляет).
Цитата(nitr @  25.1.2009,  00:53 Найти цитируемый пост)
Вот пример проще:
...
Ошибку покажет в браузере, можно сказать синтаксическая ошибка.

Выдает ошибку 500!
Цитата(nitr @  25.1.2009,  00:53 Найти цитируемый пост)
Уже покажет 500. Т.к. синтаксис верный, но у вас не скрипт CGI. Если бы вы знали что это CGI, то поняли, что здесь мы не передали заголовок.

Это выдает пустую страницу.
Цитата(nitr @  25.1.2009,  00:53 Найти цитируемый пост)
Т.е. этот:

Выдает уже My test.

Вот все, что касается последних 3 примеров в логе
Цитата

[Sun Jan 25 11:29:35 2009] [error] Global symbol "$test" requires explicit package name at D:/WWW/PERL/test2.pl line 6.\n
[Sun Jan 25 11:31:37 2009] [error] [client 127.0.0.1] malformed header from script. Bad header=My test: test2.pl
[Sun Jan 25 11:31:37 2009] [warn] /test2.pl did not send an HTTP header
[Sun Jan 25 11:31:39 2009] [error] [client 127.0.0.1] malformed header from script. Bad header=My test: test2.pl
[Sun Jan 25 11:31:39 2009] [warn] /test2.pl did not send an HTTP header

Автор: gcc 25.1.2009, 12:00
браузер может быдавть ошибку из-за прав доступа... и еще видел из-за некоторых приколов

Добавлено через 3 минуты и 28 секунд
Цитата(VladimirAlexeev @ 25.1.2009,  11:36)

Выдает уже My test.


работает?

Автор: nitr 25.1.2009, 12:25
VladimirAlexeev, смотрите у себя, у вас проблемы. Данные примеры слишком просты, чтобы так отрабатывать, в вашем случае вы скорее всего закомментировали строку use CGI::Carp 'fatalsToBrowser';.

На сколько я знаю IndigoPerl это Винда. Ставьте Perl от ActiveState и ошибок меньше, и реализация лучше (имхо).

Автор: VladimirAlexeev 25.1.2009, 13:59
Цитата(gcc @  25.1.2009,  12:00 Найти цитируемый пост)
работает? 

Третий вариант - да.
Но первые два то не так, как описали )

Цитата(nitr @  25.1.2009,  12:25 Найти цитируемый пост)
в вашем случае вы скорее всего закомментировали строку use CGI::Carp 'fatalsToBrowser';.

Как в посте написали, так и вставил в скрипт и запустил.

Цитата(nitr @  25.1.2009,  12:25 Найти цитируемый пост)
На сколько я знаю IndigoPerl это Винда. Ставьте Perl от ActiveState и ошибок меньше, и реализация лучше (имхо). 

Не понял?
IndigoPerl - это Apache+PHP+Perl. Сразу все ставится вместе.
По крайней мере папки ActivePerl там есть =)

Автор: nitr 25.1.2009, 14:59
VladimirAlexeev, покажите perl -v.
А затем perl -MCGI::Carp -e "use CGI::Carp 'fatalsToBrowser'; print '\';"

Автор: VladimirAlexeev 25.1.2009, 16:54
Цитата

>perl -v
This is perl, v5.10.0 built for MSWin32-x86-multi-thread
(with 1 registered patch, see perl -V for more detail)
...


Цитата

>perl -MCGI::Carp -e "use CGI::Carp 'fatalsToBrowser'; print '\';"
Content-type: text/html

<h1>Software error:</h1>
<pre>Can't find string terminator &quot;'&quot; anywhere before EOF at -e line 1.</pre>
<p>
For help, please send mail to this site's webmaster, giving this error message
and the time and date of the error.
</p>
[Sun Jan 25 16:50:47 2009] -e: Can't find string terminator "'" anywhere before EOF at -e line 1.

Автор: nitr 25.1.2009, 18:12
VladimirAlexeev, создайте скрипт
Код
#!perl
use CGI::Carp 'fatalsToBrowser';
print '\';

Автор: VladimirAlexeev 25.1.2009, 18:14
Создал, попытался запустить через браузер, получил ошибку 500.

Автор: gcc 25.1.2009, 18:42
nitr, мложет быть так?

Код

#!С:\perl.exe

Автор: VladimirAlexeev 25.1.2009, 19:19
gcc, не знаю это ли Вы имеете ввиду, но perl в командной строке у меня выполняется в любом месте.

Автор: nitr 25.1.2009, 23:34
gcc, зачем? smile Если перл установлен "по правилам Винды" (обычно так %80), то можно и желательно #!perl, а если что-то накосячили, то полный путь до perl.exe.

VladimirAlexeev, он имел ввиду как раз вариант с указанием полного пути до perl.exe.

VladimirAlexeev, тогда установите "ручками" Апач, сконфигурируйте его тоже "ручками" smile (т.к. лазать в конфиге Апача муторное дело, хотя есть предположение). Т.к. проблема не в скриптах, проблема не в перл. значит конфиг апача, ну или самое редкое в Винде это права.

gcc, у него нормально установлено, т.к. кое-какие скрипты нормально отрабатываются с указанием #!perl.
+ у него нормально отработала команда perl -MCGI::Carp -e "use CGI::Carp 'fatalsToBrowser'; print '\';". Лог показывает, что в браузере будет отображено именно:
Код

<h1>Software error:</h1>
<pre>Can't find string terminator &quot;'&quot; anywhere before EOF at -e line 1.</pre>
<p>
For help, please send mail to this site's webmaster, giving this error message
and the time and date of the error.
</p>

Автор: amg 26.1.2009, 09:16
Цитата(VladimirAlexeev @  25.1.2009,  16:54 Найти цитируемый пост)
perl -MCGI::Carp -e "use CGI::Carp 'fatalsToBrowser'; print '\';"
Цитата(VladimirAlexeev @  25.1.2009,  16:54 Найти цитируемый пост)
Can't find string terminator &quot;'&quot; anywhere before EOF at -e line 1.

Ну конечно (бэкслеш в одинарных кавычках, если он последний в строке, нужно экранировать). Попробуйте так:
perl -MCGI::Carp -e "use CGI::Carp 'fatalsToBrowser'; print '\\';"

Э... Туплю. Скрипт с ошибкой -- это специально для проверки?

Автор: VladimirAlexeev 26.1.2009, 09:58
Цитата(amg @  26.1.2009,  09:16 Найти цитируемый пост)
Э... Туплю. Скрипт с ошибкой -- это специально для проверки?

Похоже, что так )

Цитата(nitr @  25.1.2009,  23:34 Найти цитируемый пост)
Апач, сконфигурируйте его тоже "ручками"  (т.к. лазать в конфиге Апача муторное дело, хотя есть предположение). Т.к. проблема не в скриптах, проблема не в перл. значит конфиг апача, ну или самое редкое в Винде это права.

Конфиг Апача я уже знаю... только как его настроить под Перл? Видимо что-то особенное надо.. ) Сейчас полезу в поиск...

Автор: nitr 6.2.2009, 03:07
Цитата(amg @  26.1.2009,  09:16 Найти цитируемый пост)
Э... Туплю. Скрипт с ошибкой -- это специально для проверки?

да smile

Цитата(VladimirAlexeev @  26.1.2009,  09:58 Найти цитируемый пост)
Конфиг Апача я уже знаю... только как его настроить под Перл? Видимо что-то особенное надо.. ) Сейчас полезу в поиск...

всё в манах, и по ним ничего нового и особенного не надо.

Я более не смог найти причин, такого "отношения" к работе скриптов smile

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