Использование 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