Можно использовать в оператор, чтобы проверить, существует ли ключ в объекте:
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
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.
Что ж, первое, что вам нужно сделать, это проверить журнал вашего веб-сервера, обычно у него есть причина вызвать внутреннюю ошибку сервера.
См. 500 Ошибка сервера в списке часто задаваемых вопросов Perl.
Вы убедились, что сценарий запускается из командной строки, верно?
Похоже, вы хотите захватить вывод из test.pl
. При использовании system
или exec
этого не добиться (а с exec
ваш основной скрипт перестанет работать к моменту test.pl
] выполняется).
Вместо этого вы можете использовать обратные кавычки:
my $message = `$base_path/test.pl`;
Лучше всего попробовать более простую версию того, что вы пытаетесь сделать.
Попробуйте следующее:
test2.pl
, который делает что-то более простое. Запустить упрощенный сценарий.
#! / Bin / perl
использовать функцию «сказать»;
используйте строгий;
использовать предупреждения;
используйте Data :: Dumper;
используйте английский qw <$ OS_ERROR>;
мой $ rc = system ("$ base_path / test2.pl");
скажите "\ $ rc = $ rc";
скажите $ OS_ERROR;
Now,
$rc
is 0
. Then it worked to execute the script that way. Otherwise, $OS_ERROR
should tell you. 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.
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.
«Преждевременное завершение заголовков сценария» само по себе не является очень полезным сообщением об ошибке. Это может быть вызвано любой из нескольких причин, например:
Однако в этом случае, если мы хотим буквально воспринимать ваш пример скрипта ( выведите «TEST»
), и вы выведете это перед своим Заголовки HTTP, то вы не создаете заголовки HTTP первыми, поэтому они будут последними. Веб-сервер ожидает заголовки, а не «ТЕСТ».
Если это не так, нам нужно увидеть больше контекста вашего кода, чтобы узнать, что могло произойти.
Жалуется не 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;
Как только это сработает, попробуйте что-нибудь еще.
Один из способов найти причину преждевременного появления ошибок - это отправить ошибки в браузер. Вам просто нужно отправить заголовок типа содержимого на ранней стадии приложения, например, вот так, где-нибудь в верхней части кода:
BEGIN {
print "Content-type: text/plain\n\n";
}
Теперь вы должны увидеть ошибку в браузере.