我正在编写一个可以从命令行和网页运行的Perl脚本。该脚本接收几个参数,如果从命令行开始,则通过 $ ARGV 读取这些参数;如果从网页开始,则从 CGI 读取这些参数。我怎么能这样做?
my $username;
my $cgi = new CGI;
#IF CGI
$username = $cgi->param('username');
#IF COMMAND LINE
$username = $ARGV[0];
答案 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