IPC :: Open3更麻烦

时间:2016-10-09 21:19:24

标签: perl ipc

我在this question询问了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;

1 个答案:

答案 0 :(得分:1)

您的程序遇到以下问题:

  • \*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);
相关问题