我正在调用一个使用print写入STDOUT的函数。如何在变量中捕获它?
请注意,所有这些都发生在同一个过程中。
答案 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(单独或合并为一个字符串)。