从另一个Perl/CGI脚本向Perl/CGI脚本传递参数时出现奇怪的行为

从另一个Perl/CGI脚本向Perl/CGI脚本传递参数时出现奇怪的行为,perl,cgi,Perl,Cgi,对于正在工作的项目,我需要从一个Perl/CGI脚本调用另一个Perl/CGI脚本。这里是我用于测试的脚本的一个极其简化的版本(真正的脚本不使用递归,但这样我就不必复制和粘贴大量代码): 此脚本应该执行的操作: 打印所有参数的名称 如果定义了提交参数,请再次运行脚本,但要使用名为“abc”的参数 如果未定义“提交”参数,则打印“无提交参数” 脚本的实际功能: 打印所有参数的名称 如果定义了“submit”参数,请使用运行原始脚本时使用的相同参数再次运行脚本 如果未定义“提交”参数,则打印“无提交

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

此脚本应该执行的操作:

  • 打印所有参数的名称
  • 如果定义了提交参数,请再次运行脚本,但要使用名为“abc”的参数
  • 如果未定义“提交”参数,则打印“无提交参数”
  • 脚本的实际功能:

  • 打印所有参数的名称
  • 如果定义了“submit”参数,请使用运行原始脚本时使用的相同参数再次运行脚本
  • 如果未定义“提交”参数,则打印“无提交参数”
  • 知道是什么导致Perl/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更改行为。

    简单的答案是

    my %CGI_VARS = map { $_ => 1 } qw(
       REQUEST_METHOD
       CONTENT_LENGTH
       CONTENT_TYPE
       ...
    );
    
    local %ENV =
        map { $_ => $ENV{$_} }
         grep !$CGI_VARS{$_} && !/^HTTP/,
          keys(%ENV);
    
    #!/usr/bin/perl  --
    use strict;
    use warnings;
    
    use CGI ();
    
    Main( @ARGV );
    exit( 0 );
    
    sub Main {
        my $cgi = @_ ? CGI->new(@_) : CGI->new;
    }