Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Perl中读取STDIN并将内容写回STDIN?_Perl_Stdin - Fatal编程技术网

如何在Perl中读取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-

我必须对内部软件产品中的一些核心组件进行轻补丁。由于其对STDIN的处理非常恶劣,我必须:

  • 读取标准数据并备份原始数据
  • 解析它
  • 将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_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>; }