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(网络服务器)条件下运行。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 回答