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

return reduce(Math::max); НЕ РАВНО return reduce(max());

Но это означает, что-то вроде этого:

IntBinaryOperator myLambda = (a, b)->{(a >= b) ? a : b};//56 keystrokes I had to type -_-
return reduce(myLambda);

Вы можете просто сохранить 47 нажатий клавиш если вы пишете так

return reduce(Math::max);//Only 9 keystrokes ^_^
13
задан brian d foy 26 July 2017 в 09:57
поделиться

2 ответа

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

18
ответ дан 1 December 2019 в 20:10
поделиться

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

13
ответ дан 1 December 2019 в 20:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: