【问题标题】:How to read STDIN and write content back to STDIN in Perl?如何在 Perl 中读取 STDIN 并将内容写回 STDIN?
【发布时间】:2013-02-26 17:57:22
【问题描述】:

我必须对内部软件产品中的一些核心组件进行轻微修补。由于它对 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 数据。

【问题讨论】:

  • 我不确定您的问题描述是否有意义。这里的标准输入是什么?如果你真的可以写它,它会去上游,而不是下游。
  • 我已经添加了更多解释。
  • 写入 STDIN 会将数据发送回 Web 服务器。它不会让你再次从 STDIN 读取。
  • 根据定义,您不能将内容写入标准输入。然后它将成为输出。这很可能是XY-Problem
  • 我不同意 XY-Problem。如果允许我修改遗留代码,我同意,但情况并非如此。所以我必须重新填充 STDIN 让遗留代码再次读取它。显然只有一种方法。

标签: perl stdin


【解决方案1】:

根本不可能读取、重新填充、读取 STDIN。

【讨论】:

    【解决方案2】:

    open(STDIN, '&lt;', \$stdin_raw)怎么样


    顺便说一句,

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

    通常写成

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

    可能也更有效率。

    【讨论】:

    • my $stdin_raw = do{ local $/; &lt;STDIN&gt; };
    • @Brad Gilbert,它更干净,但它会额外复制整个文件
    • 其实我不认为$c=do{&lt;STDIN&gt;} 制作了额外的副本。它不存储在任何其他SV 中,因此不需要多个副本。如果它确实创建了一个额外的副本,则 perl 中存在一个错误。
    • @Brad Gilbert,快速测试:perl -E"say \do{ $y = 6; say \$y; $y }"。真实测试:perl -e"$x = do { local $/; &lt;&gt; }; &lt;STDIN&gt;" 100MB.txt 使用 196MB。 perl -e"{ local $/; $x=&lt;&gt; }; &lt;STDIN&gt;" 100MB.txt 使用 99MB。
    • 现在 Perl 创建了一些类似于sassign(scope(readline(gv(*STDIN))),padsv($c:2,3)) (-MO=Concise) 的东西。或许真的应该优化到padsv($c:1,3),scope(padsv($c:1,3),readline(gv(*STDIN))) (my $c;do{$c=&lt;STDIN&gt;}) 这样就不会有不必要的复制了。
    猜你喜欢
    • 2016-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多