2011-11-21 80 views
6

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

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

的符合标准的变量来核对被称为'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

回答

3

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

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

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

+0

我想你是对,其实我要创建一个核心模块和两个单独的界面,谢谢你们所有人:) – raz3r

3

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

例如,你可以使用HTTP_USER_AGENT

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

但是如果你真正需要的是测试一个CGI脚本独立,尝试的ActiveState科莫多巨蜥,调试器允许以Simulate CGI Environment

9

随着CGI.pm您可以在命令行上传递参数,无需更改代码。引用文档:

如果是通过命令行或perl的 调试运行脚本,你可以通过脚本的关键字或 参数= value对在命令行上或从标准输入列表(你 不必担心欺骗你的脚本到阅读,从 环境变量)

WRT您的例子,它做的事:

perl script.cgi username=John 
6

Mojolicious framework使用可在不同服务器上工作的经过战斗验证的环境自动检测(不仅适用于Apache)。

因此,你可以使用下面的代码:

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