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";

プログラムの出力は次のとおりです。

Hello World 出力:

4

3 に答える 3

5
  1. selectSTDOUT を変更しません。
  2. open '>', \$bufシステム ファイル ハンドルを作成しません。(誰がそこからデータを読み取って に配置しますか?別のプロセスは、たとえプロセスであったとしても、 に$buf直接書き込むことはできません。)$bufperl

1 つの解決策:

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 に答える