2

社内ソフトウェア製品のコア コンポーネントのいくつかにライト パッチを適用する必要があります。STDIN の処理が非常に厄介なため、次のことを行う必要があります。

  1. STDIN を読み取り、RAW をバックアップする
  2. 解析する
  3. RAW を STDIN に書き戻す
  4. 下流のシステムに STDIN を処理させる

残念ながら、レガシー コードを変更することは許可されていないため、簡単なパッチを適用する必要があります。

私の最初の試してみてください:

BEGIN {
  my $stdin_raw = join '', <STDIN>;
  use IO::Handle;
  my $stdin_io1 = IO::Handle->new();
  $stdin_io1->printflush( $stdin_raw );
  my $stdin_io2 = IO::Handle->new();
  $stdin_io2->printflush( $stdin_raw );
  STDIN->fdopen( $stdin_io1, 'r' );
  require CGI;
  warn CGI::param('PARAM1');
  warn CGI::param('PARAM2');
  STDIN->fdopen( $stdin_io2, 'r' );
}

最初の行で STDIN を読み取ることができますが、夜間の CGI も下流のシステムも、上記のように設定しようとした STDIN から入力を取得していません。

では、Perl で STDIN を読み取り、コンテンツを STDIN に書き戻す方法は?

アプリケーションは CGI (Web サーバー) の状態で実行されています。STDIN は Web リクエストの POST データを処理します。

4

2 に答える 2

2

どうですかopen(STDIN, '<', \$stdin_raw)


ところで、

my $stdin_raw = join '', <STDIN>;

通常は次のように書かれています

my $stdin_raw; { local $/; $stdin_raw = <STDIN>; }

おそらく効率も上がります。

于 2013-03-11T19:28:46.997 に答える
0

読み取り、補充、読み取り STDIN はまったくできません。

于 2013-04-23T13:04:19.250 に答える