#!/usr/bin/perl use strict; # https://perlmonks.org/?node_id=11164860 use warnings; sub divertSTDERR { my ($sub) = @_; my $buffer; local *STDERR; open STDERR, '>', \$buffer or die "open failed $!"; $sub->(); chomp $buffer; return $buffer; } my $buf = divertSTDERR( \&handleInner ); warn "output from handleInner:\n>>$buf<<\n"; warn "\n##################################################\n\n"; $buf = divertSTDERR( \&handleOuter ); warn "output from handleOuter:\n>>$buf<<\n"; sub handleInner { warn "inside handleInner\n"; } sub handleOuter { warn "before inner divert\n"; my $buf = divertSTDERR( \&handleInner ); warn "after inner divert\n"; warn "handleOuter returns >>$buf<< from handleInner\n"; }