【问题标题】:Strange behavior when passing parameters to a Perl/CGI script, from another Perl/CGI script从另一个 Perl/CGI 脚本向 Perl/CGI 脚本传递参数时出现奇怪的行为
【发布时间】:2012-10-03 17:27:00
【问题描述】:

对于一个正在工作的项目,我需要从另一个调用一个 Perl/CGI 脚本。我用来测试的那个脚本的一个极其简化的版本在这里(真正的脚本不使用递归,但这样我就不必复制和粘贴很多代码):

#!/usr/local/bin/perl
use CGI qw(:standard);
use POSIX 'setsid';
$|=1;

print "Content-type: text/html\n\n";

@names = param;
print "@names";

if(defined(param('submit'))){
        #delete_all();
        system('perl testParams.pl abc=123');
        exit(0);
} else{
        print "NO SUBMIT PARAM";
}

这个脚本应该做什么:

  1. 打印所有参数的名称。
  2. 如果定义了提交参数,请再次运行脚本,但使用名为“abc”的参数。
  3. 如果未定义“提交”参数,则打印“NO SUBMIT PARAM”。

脚本的实际作用:

  1. 打印所有参数的名称。
  2. 如果定义了“提交”参数,请使用与运行原始脚本相同的参数再次运行脚本。
  3. 如果未定义“提交”参数,则打印“NO SUBMIT PARAM”。

知道是什么导致 Perl/CGI 在运行脚本时忽略新参数而是发送旧参数吗?

【问题讨论】:

    标签: perl cgi


    【解决方案1】:

    CGI 仅在未找到 CGI 环境时处理命令行参数。 CGI 环境是从父进程继承的。您可以使用

    擦拭它
    my %CGI_VARS = map { $_ => 1 } qw(
       REQUEST_METHOD
       CONTENT_LENGTH
       CONTENT_TYPE
       ...
    );
    
    local %ENV =
        map { $_ => $ENV{$_} }
         grep !$CGI_VARS{$_} && !/^HTTP/,
          keys(%ENV);
    

    但这散发着糟糕的设计味道。确实,您的两个脚本应该是一个通用模块的瘦前端。

    您甚至可以对两者使用相同的脚本(通过使用符号链接),但根据用于调用脚本的 URL 来改变行为。

    【讨论】:

      【解决方案2】:

      来自 CGI with nested apps, each calling param() to get their args ,简单的答案是 create new CGI object from @ARGV

      #!/usr/bin/perl  --
      use strict;
      use warnings;
      
      use CGI ();
      
      Main( @ARGV );
      exit( 0 );
      
      sub Main {
          my $cgi = @_ ? CGI->new(@_) : CGI->new;
      }
      

      【讨论】:

        猜你喜欢
        • 2012-03-10
        • 2018-06-14
        • 1970-01-01
        • 1970-01-01
        • 2015-08-20
        • 2015-05-27
        • 2013-09-01
        • 1970-01-01
        相关资源
        最近更新 更多