3

システム コマンドを実行していて、(1) システム コマンドの STDIN をプリロードし、(2) コマンドから STDOUT をキャプチャしたいと考えています。

ここ私はこれを行うことができます:

open(SPLAT, "stuff")   || die "can't open stuff: $!";
open(STDIN, "<&SPLAT") || die "can't dupe SPLAT: $!";
print STDOUT `sort`;

これは、現在定義されている STDIN をソートの STDIN として使用します。ファイルにデータがある場合は素晴らしいですが、変数にデータがあります。システム コマンドを実行する前に、変数の内容を STDIN にロードする方法はありますか? 何かのようなもの:

open(STDIN, "<$myvariable"); # I know this syntax is not right, but you get the idea
print STDOUT `sort`;

これは、一時ファイルを使用せずに実行できますか? また、私は Windows を使用しているため、Open2 は推奨されていないと聞きました。

ありがとう。

4

2 に答える 2

4

open2Windowsで使用しない理由はありません。open2とはいえ、open3かなり低レベルのインターフェイスであるため、通常、どのプラットフォームでも最適な選択ではありません。

より良い代替手段には、IPC::RunおよびIPC::Run3が含まれます。IPC::Run は IPC::Run3 よりも少し強力ですが、後者の方が少し使いやすいです。

お勧めできますか

use IPC::Run3 qw( run3 );
my $stdin = ...;
run3([ 'sort' ], \$stdin, \my $stdout);

エラーチェックも行います。


しかし、あなたが言及open2したので、

use IPC::Open2 qw( open2 );
my $stdin =...;
my $pid = open2(\local *TO_CHILD, \local *FROM_CHILD, 'sort');
print TO_CHILD $stdin;
close TO_CHILD;
my $stdout = '';
$stdout .= $_ while <FROM_CHILD>;
waitpid($pid);
die $? if $?;
于 2012-04-20T17:33:45.303 に答える
2

15 年前の Windows ではうまく機能しなかったかもしれIPC::Open2ませんが、今では問題が発生することはないと思います。

use IPC::Open2;
my $pid = open2( \*SORT_OUT, \*SORT_IN, 'sort' );
print SORT_IN $sort_input;  # or  @sort_input
close SORT_IN;
print "The sorted output is: ", <SORT_OUT>;
close SORT_OUT;
于 2012-04-20T17:00:51.913 に答える