我正在编写一个可以从命令行和网页运行的Perl脚本。该脚本收到几个参数,并通过$ ARGV(如果它从命令行开始)和CGI(如果它从网页开始)读取这些参数。我怎样才能做到这一点?在Perl脚本中同时使用ARGV和CGI
my $username;
my $cgi = new CGI;
#IF CGI
$username = $cgi->param('username');
#IF COMMAND LINE
$username = $ARGV[0];
我正在编写一个可以从命令行和网页运行的Perl脚本。该脚本收到几个参数,并通过$ ARGV(如果它从命令行开始)和CGI(如果它从网页开始)读取这些参数。我怎样才能做到这一点?在Perl脚本中同时使用ARGV和CGI
my $username;
my $cgi = new CGI;
#IF CGI
$username = $cgi->param('username');
#IF COMMAND LINE
$username = $ARGV[0];
最简洁的方法可能是将代码的肉放在模块中,并为每个接口(CGI和命令行)提供脚本。
您可以测试CGI环境变量($ENV{SERVER_PROTOCOL}
)的存在以查看是否正在使用CGI,但如果脚本被用作另一个CGI脚本的命令行脚本,则会失败。
如果您希望通过@ARGV
传递的是表单输入,请记住,如果脚本未作为CGI脚本调用,CGI(模块)将检查@ARGV
的输入。请参阅documentation中标题为“调试”的小节。
我想你是对,其实我要创建一个核心模块和两个单独的界面,谢谢你们所有人:) – raz3r
当通过CGI调用您的脚本时,将额外设置environment variables。你可以在你的条件下使用它们。
例如,你可以使用HTTP_USER_AGENT
if ($ENV{HTTP_USER_AGENT})
{
#cgi stuff
}
else
{
#command line
}
但是如果你真正需要的是测试一个CGI脚本独立,尝试的ActiveState科莫多巨蜥,调试器允许以Simulate CGI Environment
随着CGI.pm您可以在命令行上传递参数,无需更改代码。引用文档:
如果是通过命令行或perl的 调试运行脚本,你可以通过脚本的关键字或 参数= value对在命令行上或从标准输入列表(你 不必担心欺骗你的脚本到阅读,从 环境变量)
WRT您的例子,它做的事:
perl script.cgi username=John
Mojolicious framework使用可在不同服务器上工作的经过战斗验证的环境自动检测(不仅适用于Apache)。
因此,你可以使用下面的代码:
if (defined $ENV{PATH_INFO} || defined $ENV{GATEWAY_INTERFACE}) {
# Go with CGI.pm
} else {
# Go with Getopt::Long or whatever
}
的符合标准的变量来核对被称为'GATEWAY_INTERFACE':http://stackoverflow.com/questions/1914966/how-can-i-determine -if-a-script-was-called-the-the-command-line-or-as-a-cgi-scr http://stackoverflow.com/questions/3086655/in-perl-how-to-distiniguish- between-cli-cgi-mode http://stackoverflow.com/questions/4853948/how-can-i-tell-if-a-perl-script-is-executing-in-cgi-context – daxim