Beefy Boxes and Bandwidth Generously Provided by pair Networks
Clear questions and runnable code
get the best and fastest answer
 
PerlMonks  

Re: Re: Best Way to Redirect STDERR to a Scalar

by shenme (Priest)
on Sep 14, 2003 at 02:03 UTC ( [id://291332]=note: print w/replies, xml ) Need Help??


in reply to Re: Best Way to Redirect STDERR to a Scalar
in thread Best Way to Redirect STDERR to a Scalar

Okey-dokey, I can understand frustration with packages that don't allow you to (easily) capture their debugging output.   Please try the following which works on ActiveState 5.6.1 build 635 running on Windows XP.   Amazing, no open's, no close's, but all TIE'd up prettily anyway.
my $data; print STDERR " STDERR test (1)\n"; tie *STDERR, 'IO::Scalar', \$data; print STDERR " STDERR test (2)\n"; untie *STDERR; print STDERR " STDERR test (3)\n"; printf " Scalar string has length %d\n", length($data); printf " and contains '%s'\n", $data;
Outputs
 STDERR test (1)
 STDERR test (3)
  Scalar string has length 17
    and contains ' STDERR test (2)
'

Update: Drat, it works wonderfully until you hit submit, then you think of the case that doesn't work.   If I throw in a warn which presumably uses the filehandle more directly:

tie *STDERR, 'IO::Scalar', \$data; print STDERR " STDERR test (2)\n"; warn " STDERR test (2a)"; untie *STDERR;
I then see
 STDERR test (1)
 STDERR test (2a) at mrmskrat3.pl line 14.
 STDERR test (3)
  Scalar string has length 17
    and contains ' STDERR test (2)
'
showing that some output to 'STDERR' isn't going to be captured this way.   So it will very much depend on the way the package outputs to STDERR whether this will work.   Rats!

Replies are listed 'Best First'.
Re: Re: Re: Best Way to Redirect STDERR to a Scalar
by Mr. Muskrat (Canon) on Sep 14, 2003 at 02:14 UTC

    I really thought this would do it but it did not. :-(

    use IO::Scalar; use Devel::Peek; print STDERR " STDERR test (1)\n"; my $io = ioscalar(); print STDERR " STDERR test (3)\n"; printf " Scalar string has length %d\n", length($io); printf " and contains '%s'\n", $io; print STDERR " STDERR test (4)\n"; my $peek = peek(); print STDERR " STDERR test (5)\n"; printf " Scalar string has length %d\n", length($peek); printf " and contains '%s'\n", $peek; sub ioscalar { my $data; tie *STDERR, 'IO::Scalar', \$data; print STDERR " STDERR test (2)\n"; untie *STDERR; return $data; } sub peek { my $data; my $test = 'string'; tie *STDERR, 'IO::Scalar', \$data; Dump($test); untie *STDERR; return $data; } __DATA__ STDERR test (1) STDERR test (3) Scalar string has length 17 and contains ' STDERR test (2) ' STDERR test (4) SV = PV(0x177eb58) at 0x1cbc540 REFCNT = 1 FLAGS = (PADBUSY,PADMY,POK,pPOK) PV = 0x1773c74 "string"\0 CUR = 6 LEN = 7 STDERR test (5) Scalar string has length 0 and contains ''

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://291332]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others wandering the Monastery: (4)
As of 2024-04-19 17:27 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found