Как захватить Perl STDOUT в переменной?

Я вызываю функцию, которая записывает в 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 (либо отдельно, либо объединен в одну строку).