2012-10-12 157 views
0

對於工作中的項目,我需要從另一個項目調用一個Perl/CGI腳本。該腳本,我使用的測試的一個非常簡化的版本是在這裏(真正的腳本沒有使用遞歸,但這種方式我沒有複製粘貼&了大量的代碼):將參數從另一個Perl/CGI腳本傳遞給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. 如果未定義「提交」參數,請打印「無提交參數」。

什麼腳本實際上做:

  1. 所有參數的打印名稱。
  2. 如果定義了「submit」參數,請使用與運行原始腳本相同的參數再次運行該腳本。
  3. 如果未定義「提交」參數,請打印「無提交參數」。

任何想法是什麼導致Perl/CGI忽略新參數,而是在運行腳本時發送舊參數?

回答

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來改變行爲。