Использование ARGV и CGI в скрипте Perl - PullRequest
7 голосов
/ 21 ноября 2011

Я пишу Perl-скрипт, который может запускаться как из командной строки, так и с веб-страницы.Сценарий получает пару параметров и считывает эти параметры через $ ARGV , если он запускается из командной строки, и из CGI , если он запускается с веб-страницы.Как я могу это сделать?

my $username;
my $cgi = new CGI;
#IF CGI
$username = $cgi->param('username');
#IF COMMAND LINE
$username = $ARGV[0];

Ответы [ 4 ]

9 голосов
/ 21 ноября 2011

С CGI.pm вы можете передавать параметры в командной строке без необходимости изменять ваш код. Цитирование документов:

Если вы запускаете скрипт из командной строки или в perl отладчик, вы можете передать сценарий список ключевых слов или пары параметр = значение в командной строке или из стандартного ввода (вы не нужно беспокоиться о том, чтобы обмануть ваш скрипт в чтении из переменные среды)

По вашему примеру, это вопрос выполнения:

perl script.cgi username=John
6 голосов
/ 21 ноября 2011

Mojolicious Framework использует проверенное в бою автоопределение среды, которое работает на разных серверах (не только Apache).

Таким образом, вы можете использовать следующий код:

if (defined $ENV{PATH_INFO} || defined $ENV{GATEWAY_INTERFACE}) {
    # Go with CGI.pm
} else {
    # Go with Getopt::Long or whatever
}
4 голосов
/ 21 ноября 2011

Самым чистым способом может быть помещение кода вашего кода в модуль и создание сценария для каждого интерфейса (CGI и командной строки).

Вы можете проверить наличие переменных среды CGI ($ENV{SERVER_PROTOCOL}), чтобы увидеть, используется ли CGI, но это не получится, если скрипт используется как сценарий командной строки из другого скрипта CGI.

Если все, что вы хотите передать через @ARGV, этоПомните, что CGI (модуль) проверит входные данные @ARGV, если скрипт не вызывается как скрипт CGI.См. Раздел «ОТЛАДКА» в документации .

3 голосов
/ 21 ноября 2011

При вызове через CGI ваш скрипт будет устанавливать переменные окружения .Вы можете использовать их в своем условии if.

Например, вы можете использовать HTTP_USER_AGENT

if ( $ENV{HTTP_USER_AGENT} )
{
   #cgi stuff
}
else
{
   #command line
}

Но если ваша реальная необходимость - это тестирование CGI-скрипта в отдельности, Попробуйте ActiveState Komodo, отладчик позволяет имитировать среду CGI

...