【发布时间】:2013-02-26 17:57:22
【问题描述】:
我必须对内部软件产品中的一些核心组件进行轻微修补。由于它对 STDIN 的处理非常糟糕,我必须:
- 读取 STDIN 并备份 RAW
- 解析它
- 将 RAW 写回 STDIN
- 让下游系统处理 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 数据。
【问题讨论】:
-
我不确定您的问题描述是否有意义。这里的标准输入是什么?如果你真的可以写它,它会去上游,而不是下游。
-
我已经添加了更多解释。
-
写入 STDIN 会将数据发送回 Web 服务器。它不会让你再次从 STDIN 读取。
-
根据定义,您不能将内容写入标准输入。然后它将成为输出。这很可能是XY-Problem。
-
我不同意 XY-Problem。如果允许我修改遗留代码,我同意,但情况并非如此。所以我必须重新填充 STDIN 让遗留代码再次读取它。显然只有一种方法。