Если рассматриваемый код не использует 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 (по отдельности или объединенные в одну строку).