如何在Perl中读取STDIN并将内容写回STDIN?
我必须对内部软件产品中的一些核心组件进行轻补丁。由于其对STDIN的处理非常恶劣,我必须:如何在Perl中读取STDIN并将内容写回STDIN?,perl,stdin,Perl,Stdin,我必须对内部软件产品中的一些核心组件进行轻补丁。由于其对STDIN的处理非常恶劣,我必须: 读取标准数据并备份原始数据 解析它 将RAW写回STDIN 让下游系统处理STDIN 不幸的是,我不允许修改任何遗留代码,所以我必须轻补丁它 我的第一次不工作尝试: BEGIN { my $stdin_raw = join '', <STDIN>; use IO::Handle; my $stdin_io1 = IO::Handle->new(); $stdin_io1-
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_raw=加入“”;
使用IO::Handle;
我的$stdin_io1=IO::Handle->new();
$stdin_io1->printflush($stdin_raw);
我的$stdin_io2=IO::Handle->new();
$stdin_io2->printflush($stdin_raw);
STDIN->fdopen($STDIN_io1,'r');
需要CGI;
警告CGI::param('PARAM1');
警告CGI::param('PARAM2');
STDIN->fdopen($STDIN_io2,'r');
}
它能够读取第一行中的STDIN,但nighter CGI或下游系统都无法从STDIN获得任何输入,我(尝试)将其设置为如上所示
因此:如何用Perl读取STDIN并将内容写回STDIN?
应用程序正在CGI(Web服务器)条件下运行。STDIN处理web请求的POST数据。open怎么样(STDIN,读取、重新填充、读取STDIN根本不可能。我不确定您的问题描述是否有意义。这里的STDIN是什么?如果您真的可以写入它,它将转到上游,而不是下游。我添加了更多解释。写入STDIN会将数据发送回web服务器。它不会让您再次读取STDIN。根据定义您无法将内容写入标准输入。它将成为输出。这很可能是一个问题。我不同意XY问题。我同意是否允许修改旧代码,但情况并非如此。因此,我必须重新填充STDIN,以便旧代码再次读取。显然只有一种方法。
my$STDIN_raw=do{local$/;};
@Brad Gilbert,它更干净,但它会生成整个文件的额外副本实际上我不认为$c=do{}
会生成额外副本。它不存储在任何其他文件中,因此不需要多个副本。如果它确实创建了额外副本,则会出现错误。@Brad Gilbert,快速测试:perl-E“say\do{$y=6;say\$y;$y}”
.Real test:perl-e“$x=do{local$/;};”100MB.txt
使用196MB。perl-e“{local$/;$x=};”100MB.txt
使用99MB。现在,perl创建了类似于sassign(范围(readline(gv(*STDIN))、padsv($c:2,3))
(-MO=concrete
)的东西。也许它真的应该被优化为padsv)($c:1,3)、作用域(padsv($c:1,3)、readline(gv(*STDIN))
(my$c;do{$c=}
)这样就不会有不必要的复制。
my $stdin_raw = join '', <STDIN>;
my $stdin_raw; { local $/; $stdin_raw = <STDIN>; }