在这个问题中我问的是IPC::Open3。然而,我仍然有问题。
这段代码会挂起,而不是等到在stdin上看到EOF。它也无法向stderr写入任何内容。
这不是重复的,因为那个问题问的是捕获输出,而这个问题问的是输入。
#!/usr/bin/env perl
use strict;
use warnings;
use utf8;
use v5.10;
use IPC::Open3;
use Symbol 'gensym';
my $output;
# pipe my $input, $output or die $!;
my $pid = open3(*STDIN, $output, *STDERR, 'sh',
'-c', 'echo 1 >&2; cat /usr/include/unistd.h -') or die $!;
while (<$output>) {
say $output;
}
waitpid $pid, 0;
您的程序出现以下问题:
-
*STDIN
(打开STDIN
作为连接子STDIN
的管道)应该是<&STDIN
(使用父STDIN
作为子STDIN
)。 -
*STDERR
(打开STDERR
作为连接子STDERR
的管道)应该是>&STDERR
(使用父STDERR
作为子STDERR
)。 -
say $output;
应该是say $_;
或者只是say;
。 - 您使用
say
,但是您正在打印的值已经以换行符结束。要么先使用chomp
,要么切换到print
。 -
open3
不是一个系统调用,所以它不设置$!
。 -
open3
不返回false错误;它抛出一个异常。
请注意,如果您传递单个标量作为命令,它将被传递给sh -c
。
#!/usr/bin/env perl
use strict;
use warnings;
use v5.10;
use IPC::Open3 qw( open3 );
my $pid = open3('<&STDIN', my $output, '>&STDERR',
'echo 1 >&2; cat /usr/include/unistd.h -');
while (<$output>) {
chomp;
say "<$_>";
}
waitpid($pid, 0);