More trouble with IPC::Open3



在这个问题中我问的是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);

最新更新