Почему делает мой Perl, CGI жалуется на “Преждевременный конец заголовков сценария”?

Можно использовать в оператор, чтобы проверить, существует ли ключ в объекте:

var x = 1;
var y = 3;
var list = {0:0, 1:0, 2:0};
x in list; //true
y in list; //false
1 in list; //true
y in {3:0, 4:0, 5:0}; //true

при нахождении литералов объектов слишком ужасными можно объединить его с функциональной подсказкой без параметров:

function list()
 { var x = {};
   for(var i=0; i < arguments.length; ++i) x[arguments[i]] = 0;
   return x
 }

 5 in list(1,2,3,4,5) //true
5
задан brian d foy 1 December 2009 в 18:40
поделиться

9 ответов

You probably want system, not exec:

The exec function executes a system command and never returns-- use system instead of exec if you want it to return.

See the documentation for exec.

2
ответ дан 18 December 2019 в 13:15
поделиться

Что ж, первое, что вам нужно сделать, это проверить журнал вашего веб-сервера, обычно у него есть причина вызвать внутреннюю ошибку сервера.

2
ответ дан 18 December 2019 в 13:15
поделиться

См. 500 Ошибка сервера в списке часто задаваемых вопросов Perl.

Вы убедились, что сценарий запускается из командной строки, верно?

1
ответ дан 18 December 2019 в 13:15
поделиться

Похоже, вы хотите захватить вывод из test.pl . При использовании system или exec этого не добиться (а с exec ваш основной скрипт перестанет работать к моменту test.pl ] выполняется).

Вместо этого вы можете использовать обратные кавычки:

my $message = `$base_path/test.pl`;
0
ответ дан 18 December 2019 в 13:15
поделиться

Лучше всего попробовать более простую версию того, что вы пытаетесь сделать.

Попробуйте следующее:

  • Создайте что-нибудь вроде test2.pl , который делает что-то более простое.
  • Запустить упрощенный сценарий.

     #! / Bin / perl
    использовать функцию «сказать»;
    используйте строгий;
    использовать предупреждения;
    используйте Data :: Dumper;
    используйте английский qw <$ OS_ERROR>;
    
    мой $ rc = system ("$ base_path / test2.pl");
    скажите "\ $ rc = $ rc";
    скажите $ OS_ERROR;
    

Now,

  1. If $rc is 0. Then it worked to execute the script that way. Otherwise, $OS_ERROR should tell you.
  2. If this all works, then you could try to execute the original script and see if that works as well.
  3. If that works, then it could be the state of the program at the time it is called.

But, as other people have noted, unless you're all done running the script, exec-ing from the script is not what you want to do, even if it were a program. That would just load the program over the space used by the script.

Using the qx or backticks (`) will allow the command line to be interpreted by the shell which will handle the shebangs (#!) in the perl script and return the output of the script.

0
ответ дан 18 December 2019 в 13:15
поделиться

I've always been a fan of using qx for my system calls:

my @array = qx(ls -1);

system returns a string which then needs to be parsed, by qx returns an array, and if you know line 4 has the info you need, you can just go there and grab it.

-2
ответ дан 18 December 2019 в 13:15
поделиться

«Преждевременное завершение заголовков сценария» само по себе не является очень полезным сообщением об ошибке. Это может быть вызвано любой из нескольких причин, например:

  • не исполняется (проблема с правами доступа)
  • сбой компиляции (синтаксическая ошибка, проблема зависимости и т. Д.)
  • преждевременное завершение во время обычного выполнения
  • ] создание чего-то другого, кроме правильных заголовков HTTP, в качестве первого вывода вашего скрипта

Однако в этом случае, если мы хотим буквально воспринимать ваш пример скрипта ( выведите «TEST» ), и вы выведете это перед своим Заголовки HTTP, то вы не создаете заголовки HTTP первыми, поэтому они будут последними. Веб-сервер ожидает заголовки, а не «ТЕСТ».

Если это не так, нам нужно увидеть больше контекста вашего кода, чтобы узнать, что могло произойти.

8
ответ дан 18 December 2019 в 13:15
поделиться

Жалуется не Perl CGI, а Apache. Apache сообщает, что ваш сценарий CGI не выводит требуемые заголовки, поэтому это первое, что вам нужно сделать.

Я всегда сначала пробую CGI с помощью сценария printenv, например,

#!/usr/bin/env perl

use warnings;
use strict;

print "Content-type: text/plain\r\n\r\n";
print "$_ => $ENV{$_}\r\n" for sort keys %ENV;

Как только это сработает, попробуйте что-нибудь еще.

1
ответ дан 18 December 2019 в 13:15
поделиться

Один из способов найти причину преждевременного появления ошибок - это отправить ошибки в браузер. Вам просто нужно отправить заголовок типа содержимого на ранней стадии приложения, например, вот так, где-нибудь в верхней части кода:

BEGIN {
    print "Content-type: text/plain\n\n";
}

Теперь вы должны увидеть ошибку в браузере.

2
ответ дан 18 December 2019 в 13:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: