问题描述
给出以下代码,用户将看到它打印了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
,因为这会等待孩子完成。)