Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Perl脚本中同时使用ARGV和CGI_Perl_Command Line_Parameters_Cgi - Fatal编程技术网

在Perl脚本中同时使用ARGV和CGI

在Perl脚本中同时使用ARGV和CGI,perl,command-line,parameters,cgi,Perl,Command Line,Parameters,Cgi,我正在编写一个可以从命令行和网页运行的Perl脚本。脚本接收两个参数,如果从命令行启动,则通过$ARGV读取这些参数;如果从网页启动,则通过CGI读取这些参数。我该怎么做 my $username; my $cgi = new CGI; #IF CGI $username = $cgi->param('username'); #IF COMMAND LINE $username = $ARGV[0]; 当通过CGI调用时,您的脚本将被额外设置。您可以在您的if条件下使用它们 例如,您可以

我正在编写一个可以从命令行和网页运行的Perl脚本。脚本接收两个参数,如果从命令行启动,则通过$ARGV读取这些参数;如果从网页启动,则通过CGI读取这些参数。我该怎么做

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

当通过CGI调用时,您的脚本将被额外设置。您可以在您的if条件下使用它们

例如,您可以使用HTTP\u USER\u代理

if ( $ENV{HTTP_USER_AGENT} )
{
   #cgi stuff
}
else
{
   #command line
}
但是,如果您真正需要单独测试CGI脚本,请尝试ActiveState Komodo,调试器允许您在命令行上传递参数,而无需更改代码。引用文件:

如果您是从命令行或在perl中运行脚本 调试器,您可以向脚本传递关键字列表或 参数=命令行或标准输入中的值对(您可以 不必担心你的脚本会被欺骗而从 环境变量)

举个例子,这是一个做以下事情的问题:

perl script.cgi username=John

最干净的方法可能是将代码的主要部分放在一个模块中,并为每个接口(CGI和命令行)编写一个脚本

您可以测试是否存在CGI环境变量(
$ENV{SERVER\u PROTOCOL}
),以查看是否正在使用CGI,但如果将该脚本用作另一个CGI脚本的命令行脚本,则该测试将失败

如果希望通过
@ARGV
传递的都是表单输入,请记住,如果脚本未作为CGI脚本调用,CGI(模块)将检查
@ARGV
的输入。请参阅中标题为“调试”的部分。

使用在不同服务器上工作的经战斗验证的环境自动检测(不仅仅是Apache)

因此,您可以使用以下代码:

if (defined $ENV{PATH_INFO} || defined $ENV{GATEWAY_INTERFACE}) {
    # Go with CGI.pm
} else {
    # Go with Getopt::Long or whatever
}

要检查的标准兼容变量称为
GATEWAY\u INTERFACE
:我想你是对的,事实上我将创建一个核心模块和两个单独的接口,谢谢大家:)