【问题标题】:Using both ARGV and CGI in a Perl script在 Perl 脚本中同时使用 ARGV 和 CGI
【发布时间】:2012-01-03 03:21:27
【问题描述】:

我正在编写一个可以从命令行和网页运行的 Perl 脚本。该脚本接收几个参数,如果它从命令行启动,它会通过 $ARGV 读取这些参数,如果它从网页启动,它会从 CGI 读取这些参数。我该怎么做?

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

【问题讨论】:

标签: perl command-line parameters cgi


【解决方案1】:

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

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

写你的例子,这是一个问题:

perl script.cgi username=John

【讨论】:

    【解决方案2】:

    Mojolicious framework 使用经过实战验证的环境自动检测,适用于不同的服务器(不仅限于 Apache)。

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • 我猜你是对的,其实我要创建一个核心模块和两个独立的接口,谢谢大家:)
      【解决方案4】:

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

      例如,您可以使用 HTTP_USER_AGENT

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

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

      【讨论】:

        猜你喜欢
        • 2015-04-09
        • 2015-05-27
        • 1970-01-01
        • 2012-03-10
        • 2012-01-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多