The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package PrimitiveCapture;
use strict;
use warnings;

sub capture_stdout {
  my $sub = shift;
  my $stdout;
  open my $oldout, ">&STDOUT" or die "Can't dup STDOUT: $!";
  close STDOUT;
  open STDOUT, '>', \$stdout or die "Can't open STDOUT: $!";

  $sub->();

  close STDOUT;
  open STDOUT, ">&", $oldout or die "Can't dup \$oldout: $!";
  return $stdout;
}

sub capture_stderr {
  my $sub = shift;
  my $stderr;
  open my $olderr, ">&STDERR" or die "Can't dup STDERR: $!";
  close STDERR;
  open STDERR, '>', \$stderr or die "Can't open STDERR: $!";

  $sub->();

  close STDERR;
  open STDERR, ">&", $olderr or die "Can't dup \$olderr: $!";
  return $stderr;
}

1;