|
| Try this amazing little Perl sniplet:
#=====================
open my $oldout, ">&STDOUT" or die "Can't dup STDOUT: $!";
open OLDERR, ">&", \*STDERR or die "Can't dup STDERR: $!";
close STDOUT;
open STDOUT, '>', \$str or die "Can't redirect STDOUT: $!";
close STDERR;
open STDERR, ">&STDOUT" or die "Can't dup STDOUT: $!";
select STDERR; $| = 1; # make unbuffered
select STDOUT; $| = 1; # make unbuffered
# print STDOUT "stdout 1\n"; # this works for
# print STDERR "stderr 1\n"; # subprocesses too
tst();
open STDOUT, ">&", $oldout or die "Can't dup \$oldout: $!";
open STDERR, ">&OLDERR" or die "Can't dup OLDERR: $!";
print '$str=' . $str;
print STDOUT "stdout 2\n";
print STDERR "stderr 2\n";
1;
sub tst() {
print 'in tst' . "\n";
}
#==========================
The call to "tst()" could be any subroutine or package call and the result is that whatever would have been returned to the browser (because it was "print"ed), gets stored in $str. |
|