1

在运行以下 Perl 程序时,子脚本的输出将打印到终端而不是进入$v. 请让我知道如何解决它。

open (OUTPUT, '>', \$v);
select OUTPUT;
$| = 1;

open (SUB, "| sh print_user_input.sh");
print SUB "Hello World\n";
close(SUB);

close(OUTPUT);
select STDOUT;

print "Output: $v\n";

程序的输出是:

你好世界输出:

4

3 回答 3

5
  1. select不会改变标准输出。
  2. open '>', \$buf不创建系统文件句柄。(谁会从中读取数据并将数据放入$buf?另一个进程不能直接写入$buf,即使是perl一个进程。)

一种解决方案:

use IPC::Run3 qw( run3 );
run3 [ 'sh', 'print_user_input.sh' ],
   \"Hello World\n",
   \my $v;
于 2012-08-01T16:50:13.993 回答
3

你有2个问题。 select不会改变 STDOUT,它只是改变了 Perl 关于它应该打印到哪个文件句柄的想法。像您尝试使用的内存中文件句柄只能在单个 Perl 进程中工作;您不能在子进程中使用它们。

您想查看IPC::Open3或类似模块。

于 2012-08-01T16:51:03.307 回答
0

使用IPC::Open2open2功能:

#!/usr/bin/env perl

use strict;
use warnings;

use IPC::Open2;

my $pid = open2( \*CHLD_OUT, \*CHLD_IN, 'sh print_user_input.sh' );
print CHLD_OUT "Hello World\n";
close CHLD_OUT;

my $output = do { local $/; <CHLD_OUT> };
print "Output: $output";
于 2012-08-01T17:02:52.880 回答