Как мне захватить STDOUT Perl в переменной? - PullRequest
13 голосов
/ 18 августа 2010

Я вызываю функцию, которая пишет в STDOUT, используя print.Как я могу зафиксировать это в переменной?

Обратите внимание, что все это происходит в одном и том же процессе.

Ответы [ 2 ]

18 голосов
/ 18 августа 2010

Новый, крутой способ справиться с этим - Capture :: Tiny . Вы можете использовать его хирургическим путем, чтобы воздействовать только на ту часть программы, где она вам нужна, не мешая ничему другому. Но я бы, вероятно, сделал то, что cjm рекомендует , поскольку для этого не требуется модуль.

13 голосов
/ 18 августа 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...