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::RunIPC::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

也许IPC::Open215 年前在 Windows 上运行得不太好,但我不认为你现在会遇到任何麻烦。

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 回答