如何获得流效果,例如使用IPC :: Run3打开管道?

问题描述

给出以下代码用户将看到它打印了3次,第二次是“ Hello World!”。

#!/bin/perl
$| = 1;
use feature ':5.10';
use strict;
use warnings;

use constant PERL_SCRIPT => '$|=1; foreach (0..3) {say "World!"; sleep 1}';

open ( my $h,'-|','/bin/perl','-wE',PERL_SCRIPT() ) or die $!; 
while (<$h>) {
  print "Hello $_";
}

如何用IPC::Run3达到同样的效果?注意,我不想缓冲。我要流。

我为什么使用IPC::Run3?我想将stdin指向/dev/null。而且,我不需要与另一个Shell执行程序进行实际的重定向

解决方法

首先,如果您在父级中不需要STDIN,则可以将以下代码与现有代码一起使用。

open(STDIN,'<','/dev/null') or die $!;

我认为您不能使用IPC :: Run3,但是可以使用IPC :: Run。

use IPC::Run qw( run );

run [ $^X,-wE => PERL_SCRIPT ],\undef,sub { print "Hello $_[0]" };

如果要使用管道,可以使用以下内容:

use IPC::Run qw( start );
use Symbol   qw( gensym );

my $h =
   start [ $^X,'>pipe',my $pipe = gensym;

print "Hello $_" while <$pipe>;

$h->finish();

(您不能使用run,因为这会等待孩子完成。)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...