在Perl脚本中使用ARGV和CGI

时间:2011-11-21 16:24:13

标签: 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];

4 个答案:

答案 0 :(得分:9)

使用CGI.pm,您可以在命令行上传递params,而无需更改代码。引用文档:

  

如果从命令行或perl运行脚本   调试器,你可以传递一个关键字列表或脚本   命令行上的参数=值对或来自标准输入(你   不必担心欺骗你的脚本阅读   环境变量)

以你的榜样为例,这是一个问题:

perl script.cgi username=John

答案 1 :(得分:6)

Mojolicious framework使用经过战争验证的环境自动检测功能,可在不同的服务器上运行(仅限Apache)。

所以你可以使用以下代码:

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

答案 2 :(得分:4)

最干净的方法可能是将代码的内容放在一个模块中,并为每个接口(CGI和命令行)提供一个脚本。

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

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

答案 3 :(得分:3)

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

例如,您可以使用 HTTP_USER_AGENT

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

但如果您真正需要独立测试CGI脚本,请尝试使用ActiveState Komodo,调试器允许 Simulate CGI Environment