对于正在工作的项目,我需要从另一个调用一个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";
}
这个脚本应该做什么:
脚本实际上做了什么:
知道是什么导致Perl / CGI忽略新参数,而是在运行脚本时发送旧参数吗?
答案 0 :(得分: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更改行为。
答案 1 :(得分:0)
从 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;
}