【问题标题】:How to connect processes via pipe in Perl?如何在 Perl 中通过管道连接进程?
【发布时间】:2019-01-07 13:24:22
【问题描述】:

我想编写一个 Perl 脚本,它运行程序 foobar 并处理 foostdout 并以流式方式将其发送到 stdinbar。 Perl 脚本应该像这样bash 命令:

$ foo | some-perl-code | bar

我设法用下面的 sn-p 完成了第一部分。我启动程序foo并打开管道读取stdout

open( my $pipe_fh, "foo |" );
while ( my $row = <$pipe_fh> ) {
   # do stuff
    print $row;
}

如何实现第二部分?如何将$row 发送到程序bar 我的Perl 脚本中?

【问题讨论】:

  • 为什么必须在 Perl 脚本中?为什么不能直接使用bash?

标签: bash perl pipe


【解决方案1】:

IPC::Run 也是另一个(有点吓人的)选项。如果你最终得到了复杂的管道,我也可以推荐(无耻推广自己的模块)IPC::PrettyPipe,我写这个是为了帮助渲染复杂的管道。

【讨论】:

    【解决方案2】:

    另一种选择是使用IPC::Pipeline 将进程链接在一起,而不是手动执行。

    【讨论】:

      【解决方案3】:

      只需使用另一个打开,但恢复管道的方向:

      open my $in,  '-|', 'foo' or die $!;
      open my $out, '|-', 'bar' or die $!;
      while ( my $row = <$in> ) {
          # do stuff
          print {$out} $row;
      }
      

      【讨论】:

        猜你喜欢
        • 2010-09-22
        • 2012-08-24
        • 2011-02-03
        • 2021-09-20
        • 1970-01-01
        • 2016-05-05
        • 2013-07-30
        • 1970-01-01
        相关资源
        最近更新 更多