Использование ARGV и CGI в скрипте Perl
Я пишу сценарий Perl, который может выполняться как из командной строки, так и с веб-страницы. Скрипт получает пару параметров и считывает эти параметры через $ARGV если это началось из командной строки и из CGI если это началось с веб-страницы. Как я могу это сделать?
my $username;
my $cgi = new CGI;
#IF CGI
$username = $cgi->param('username');
#IF COMMAND LINE
$username = $ARGV[0];
4 ответов
самый чистый способ может заключаться в том, чтобы поместить мясо вашего кода в модуль и иметь скрипт для каждого интерфейса (CGI и командной строки).
вы можете проверить наличие переменных окружения CGI ($ENV{SERVER_PROTOCOL}
), чтобы увидеть, используется ли CGI, но это не удастся, если сценарий используется в качестве сценария командной строки из другого сценария CGI.
Если все, что вы хотите пройти через @ARGV
форма входа, имейте в виду, что CGI (модуль) будет проверять @ARGV
для входа, если сценарий не вызывается как сценарий CGI. См. раздел "отладка" в документация.
С CGI.pm Вы можете передавать параметры в командной строке без необходимости изменения кода. Цитирование документов:
Если вы запускаете скрипт из командной строки или в perl отладчик, вы можете передать скрипту список ключевых слов или параметр=значение в командной строке или из стандартного ввода (вы не нужно беспокоиться о том, чтобы обмануть ваш сценарий в чтение из переменные среды)
Wrt ваш пример, это вопрос:
perl script.cgi username=John
Mojolicious framework использует проверенную в бою среду автоопределения, которая работает на разных серверах (не только Apache).
Так что вы можете использовать следующий код:
if (defined $ENV{PATH_INFO} || defined $ENV{GATEWAY_INTERFACE}) {
# Go with CGI.pm
} else {
# Go with Getopt::Long or whatever
}
при вызове через CGI ваш скрипт будет дополнительно переменные среды set. Вы можете использовать их в условие if.
например, вы можете использовать HTTP_USER_AGENT
if ( $ENV{HTTP_USER_AGENT} )
{
#cgi stuff
}
else
{
#command line
}
но если ваша реальная потребность-протестировать сценарий CGI отдельно, попробуйте ActiveState Komodo, отладчик позволяет имитация среды CGI