http://qs1969.pair.com?node_id=11137777


in reply to Re: Assigning printf to a variable
in thread Assigning printf to a variable

local( *STDOUT ) = $fh;

Or select, though in this example local does have the advantage that it is restored after the block ends.

But in general, when wanting to capture STDOUT/ERR, I'd recommend Capture::Tiny.

Replies are listed 'Best First'.
Re^3: Assigning printf to a variable
by pryrt (Monsignor) on Oct 20, 2021 at 14:56 UTC
    But in general, when wanting to capture STDOUT/ERR, I'd recommend Capture::Tiny.

    But can Capture::Tiny be used to capture the STDOUT/ERR of the same script that's running?

    Answering my own question, I see the tee and related functions, but that requires that you put the whole script (or at least the parts you want to capture) inside the block that tee is calling. Would there be an equivalent to my Re^2: Errors uncaught by CGI::Carp solution, which captured the STDOUT for the whole script, then did two things with that output during the END (process to one location and dump to the old STDOUT)? Though I guess that use Capture::Tiny; my @capture = tee { ...whole script here... }; process(@capture); isn't that different from BEGIN { duplicate } END { process(...) } ... whole script here .... I guess I'm just trying to see what other ways are possible in the TIMTOWTDI: so would tee {original script contents} be the canonical way with Capture::Tiny, or is there something that involves less wrapping?

    (Sorry for the rambling, self-responding post)