在运行以下Perl程序时,子脚本的输出将打印到终端,而不是进入$v
。请让我知道如何修复它。
open (OUTPUT, '>', $v);
select OUTPUT;
$| = 1;
open (SUB, "| sh print_user_input.sh");
print SUB "Hello Worldn";
close(SUB);
close(OUTPUT);
select STDOUT;
print "Output: $vn";
程序的输出为:
Hello World输出:
select
不会改变STDOUTopen '>', $buf
不创建系统文件句柄。(谁会从中读取数据并将数据放在$buf
中?另一个进程不能直接写入$buf
,即使perl
是一个进程。)
一种解决方案:
use IPC::Run3 qw( run3 );
run3 [ 'sh', 'print_user_input.sh' ],
"Hello Worldn",
my $v;
您有两个问题。select并没有改变STDOUT,它只是改变了Perl应该打印到哪个文件句柄的想法;不能在子进程中使用它们。
您希望查看IPC::Open3或类似的模块。
使用IPC::Open2
的open2
函数:
#!/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 Worldn";
close CHLD_OUT;
my $output = do { local $/; <CHLD_OUT> };
print "Output: $output";