in reply to Re (tilly) 1: codeopen(INPUT, "<INPUT") gives INPUT opened only for output
in thread codeopen(INPUT, "<INPUT") gives INPUT opened only for output
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;
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re: Re: Re (tilly) 1: open(INPUT, "<INPUT") gives INPUT opened only for output
by belg4mit (Prior) on Nov 17, 2001 at 00:08 UTC |