0

作業中のプロジェクトでは、ある 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. 「submit」パラメータが定義されていない場合は、「NO SUBMIT PARAM」と出力します。

スクリプトが実際に行うこと:

  1. すべてのパラメータの名前を出力します。
  2. 「submit」パラメーターが定義されている場合は、元のスクリプトを実行したときと同じパラメーターを使用してスクリプトを再度実行します。
  3. 「submit」パラメータが定義されていない場合は、「NO SUBMIT PARAM」と出力します。

スクリプトの実行時に、Perl/CGI が新しいパラメーターを無視し、代わりに古いパラメーターを送信する原因は何ですか?

4

2 に答える 2

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);

しかし、これは悪いデザインの悪臭です。実際、2つのスクリプトは、共通モジュールの薄いフロントエンドである必要があります。

(シンボリックリンクを使用して)両方に同じスクリプトを使用することもできますが、スクリプトの呼び出しに使用されるURLに基​​づいて動作を変更します。

于 2012-10-12T20:51:17.740 に答える
0

ネストされたアプリを使用した 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;
}
于 2012-10-14T08:39:38.127 に答える