簡體   English   中英

從另一個Perl / CGI腳本向Perl / CGI腳本傳遞參數時的奇怪行為

[英]Strange behavior when passing parameters to a Perl/CGI script, from another Perl/CGI script

對於工作中的項目,我需要從另一個調用一個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. 如果定義了submit參數,請再次運行腳本,但使用名為“abc”的參數。
  3. 如果未定義“submit”參數,則打印“NO SUBMIT PARAM”。

腳本實際上做了什么:

  1. 打印所有參數的名稱。
  2. 如果定義了“submit”參數,請使用與運行原始腳本相同的參數再次運行腳本。
  3. 如果未定義“submit”參數,則打印“NO SUBMIT PARAM”。

知道是什么導致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()得到他們的args簡單的答案是從@ARGV創建新的CGI對象

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

use CGI ();

Main( @ARGV );
exit( 0 );

sub Main {
    my $cgi = @_ ? CGI->new(@_) : CGI->new;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM