An alternative is to avoid the tmpfile altogether and tie an IO::Scalar for capturing the output. We can also localize STDOUT and STDERR (rather than select) and provide a simple __WARN__ sig handler to make up for some of the mentioned caveats:
#!/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;
In reply to Re: Re (tilly) 1: codeopen(INPUT, "<INPUT") gives INPUT opened only for output
by danger
in thread codeopen(INPUT, "<INPUT") gives INPUT opened only for output
by belg4mit
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |