如何在变量中捕获Perl的STDOUT?

时间:2010-08-18 02:59:58

标签: perl

我正在调用一个使用print写入STDOUT的函数。如何在变量中捕获它?

请注意,所有这些都发生在同一个过程中。

2 个答案:

答案 0 :(得分:18)

处理此问题的新方式是Capture::Tiny。您可以通过手术使用它来影响您需要它的程序部分,而不会打扰其他任何事情。但是,我可能会做cjm recommends,因为那不需要模块。

答案 1 :(得分:13)

如果相关代码没有明确使用STDOUT(即它只是print "..."),您可以使用select来更改print使用的文件句柄:

my $output;
open(my $outputFH, '>', \$output) or die; # This shouldn't fail
my $oldFH = select $outputFH;
call_code_that_prints();
select $oldFH;
close $outputFH;

print $output;    # Here's what we collected

使用select可以更轻松地恢复STDOUT。关闭和重新打开STDOUT很难撤消。请注意select不会影响STDOUT本身,因此它不会影响外部进程,但是您说没有任何外部进程。它也不会影响像print STDOUT "..."这样的代码。

如果select方法不足以满足您的需求,我建议您尝试Capture::Tiny。它可以捕获外部程序的输出和明确写入STDOUT的代码。但它(目前)不能仅捕获STDOUT;它总是捕获STDOUT和STDERR(单独或合并为一个字符串)。