#!/usr/bin/perl -w use strict; use IO::Scalar; use Carp; my $out = eval_print_trap(<<'EOC'); print "Hello World\n"; print STDOUT "Hello again\n"; print STDERR "stderr is here too\n"; print "this uninit warning is captured:$a\n"; warn "and explicit warnings as well"; system(q|echo "Can't have everything!"|); EOC print "***\n$out***\n"; print "done\n"; sub eval_print_trap { my $code = shift; my $string; my $SH = IO::Scalar->new_tie(\$string); { local *STDOUT = $SH; local *STDERR = $SH; local $SIG{__WARN__} = sub{print @_}; eval($code); } if($@){ confess "Evaling\n'$code'\ngave error $@"; } return $string; } __END__ ### could also have this at the end: seek($SH,0,0); wantarray ? <$SH> : $string;