0

对于工作中的项目,我需要从另一个调用一个 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 在运行脚本时忽略新参数而是发送旧参数吗?

4

2 回答 2

2

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 更改行为。

于 2012-10-12T20:51:17.740 回答
0

具有嵌套应用程序的 CGI 中,每个调用 param() 来获取它们的参数,简单的答案是从 @ARGV 创建新的 CGI 对象

#!/usr/bin/perl  --
use strict;
use warnings;

use CGI ();

Main( @ARGV );
exit( 0 );

sub Main {
    my $cgi = @_ ? CGI->new(@_) : CGI->new;
}
于 2012-10-14T08:39:38.127 回答