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

R.D*_*R.D 13 perl

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

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

bri*_*foy 18

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


cjm*_*cjm 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
Run Code Online (Sandbox Code Playgroud)

使用后select可以更轻松地恢复STDOUT.关闭和重新打开STDOUT很难撤消.注意,select这不会影响STDOUT本身,所以它不会影响外部进程,但是你说你没有任何东西.它也不会影响执行类似操作的代码print STDOUT "...".

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