对于一个工作中的项目,我需要从一个Perl/CGI脚本调用另一个。我用于测试的该脚本的一个极其简化的版本在这里(真正的脚本不使用递归,但这样我就不必复制和粘贴大量代码):
#!/usr/local/bin/perl
use CGI qw(:standard);
use POSIX 'setsid';
$|=1;
print "Content-type: text/htmlnn";
@names = param;
print "@names";
if(defined(param('submit'))){
#delete_all();
system('perl testParams.pl abc=123');
exit(0);
} else{
print "NO SUBMIT PARAM";
}
这个脚本应该做什么:
- 打印所有参数的名称。
- 如果定义了提交参数,请再次运行脚本,但使用名为"abc"的参数。
- 如果未定义"提交"参数,请打印"无提交参数"。
脚本实际执行的操作:
- 打印所有参数的名称。
- 如果定义了"submit"参数,请使用运行原始脚本时使用的相同参数再次运行脚本。
- 如果未定义"提交"参数,请打印"无提交参数"。
知道是什么导致Perl/CGI忽略新参数,而是在运行脚本时发送旧参数吗?
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 更改行为。
从带有嵌套应用程序的 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;
}