在Perl脚本中使用ARGV和CGI

raz*_*z3r 7 parameters perl command-line cgi

我正在编写一个可以从命令行和网页运行的Perl脚本.该脚本接收几个参数,如果它从命令行开始,则通过$ ARGV读取这些参数,如果从网页开始,则从CGI读取这些参数.我怎样才能做到这一点?

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

lar*_*sen 9

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

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

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

perl script.cgi username=John
Run Code Online (Sandbox Code Playgroud)


yko*_*yko 6

Mojolicious框架使用经过战斗验证的环境自动检测,可在不同的服务器上运行(不仅仅是Apache).

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

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


ike*_*ami 4

最简洁的方法可能是将代码的核心部分放入模块中,并为每个接口(CGI 和命令行)编写一个脚本。

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

如果您想要传递的只是@ARGV表单输入,请记住,@ARGV如果脚本未作为 CGI 脚本调用,CGI(模块)将检查输入。请参阅文档中标题为“调试”的部分。