Я вызываю функцию, которая записывает в STDOUT с помощью печати. Как я могу захватить это в переменной?
Обратите внимание, что все это происходит в одном процессе.
Ответ 1
Новый, классный способ справиться с этим - Capture:: Tiny. Вы можете использовать его хирургически, чтобы воздействовать только на ту часть программы, в которой она вам нужна, не беспокоя ничего. Но, вероятно, я бы сделал то, что cjm рекомендует, поскольку для этого не требуется модуль.
Ответ 2
Если этот код не использует 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 what we collected
Использование select упрощает восстановление STDOUT после этого. Закрытие и повторное открытие STDOUT труднее отменить. Обратите внимание, что select не влияет на сам STDOUT, поэтому он не влияет на внешние процессы, но вы сказали, что у вас его нет. Он также не влияет на код, который делает что-то вроде print STDOUT "...".
Если метода select недостаточно для ваших нужд, я бы рекомендовал вам попробовать Capture::Tiny. Он может захватывать выходные данные из внешних программ и кода, которые явно записываются в STDOUT. Но он не может (в настоящее время) захватывать только STDOUT; он всегда захватывает как STDOUT, так и STDERR (либо отдельно, либо объединен в одну строку).