in reply to Re^2: Overloading print()
in thread Overloading print()

Why don't you make Math::MPFR capture the output to STDOUT by localizing *STDOUT in the wrapper functions and redirecting it to a string?

Then you can return the strings instead of printing them, and produce all output with perl's print.

Or do you do that already?

Replies are listed 'Best First'.
Re^4: Overloading print()
by syphilis (Archbishop) on Sep 05, 2007 at 09:51 UTC
    Or do you do that already?

    Nope ... but it sounds promising. Where do I find the relevant documentation ? (Haven't done anything like this before, afaicr.)

    Cheers,
    Rob
        I followed the link to Redirecting STDOUT, lexically scoped and tried the following test script (based on an example I found there):
        use warnings; use Math::MPFR qw(:mpfr); print "Hello world\n"; { local(*STDOUT); open(STDOUT, ">", "output.txt") or die $!; #line 10 $num = Math::MPFR->new(); #$num is a '@NaN@' Rmpfr_out_str($num, 10, 0, GMP_RNDN); close STDOUT; } print "Goodbye world\n";
        Rmpfr_out_str (which wraps the mpfr library's mpfr_out_str function) prints directly to stdout, so I expected that output.txt would contain @NaN@ and the output to the console would look like:
        Hello world Goodbye world
        However, output.txt is empty, and the console output looks like:
        Hello world @NaN@Goodbye world
        Apparently, redirecting perl's stdout has had no effect on xs's stdout. I guess I would need to redirect stdout from within the XSub.

        There's another issue, too, I believe. I think I really want to redirect the output to a variable (which I can return) rather than to a file. But if I replace output.txt with a variable (say, $output) then the script just errors out with No such file or directory at try.pl line 10.

        I'm starting to wonder if this approach (interesting though it is) is going to lead to a practical solution.

        Wouldn't I be better off requesting (politely, of course) of the mpfr developers that future releases of the mpfr library provide a function that returns the same formatted string as output by mpfr_out_str ?

        Cheers,
        Rob