如何在Perl中读取STDIN并将内容写回STDIN?

时间:2013-03-11 14:04:29

标签: perl stdin

我必须修补内部软件产品中的一些核心组件。由于它对STDIN的恶劣处理,我必须:

  1. 读取STDIN并备份RAW
  2. 解析它
  3. 将RAW写回STDIN
  4. 让下游系统处理STDIN
  5. 不幸的是,我不允许修改任何遗留代码,因此我必须对其进行修补。

    我的第一次不工作尝试:

    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(webserver)条件下运行。 STDIN处理Web请求的POST数据。

2 个答案:

答案 0 :(得分:1)

open(STDIN, '<', \$stdin_raw)

怎么样?

顺便说一下,

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

通常写成

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

也可能更有效率。

答案 1 :(得分:0)

根本无法读取,重新填充,读取STDIN。