in reply to Re: Both print and redirect STDOUT and STDERR
in thread Both print and redirect STDOUT and STDERR

File::Tee fails on Windows.

However this is not as simple a problem as I first thought. First I thought you should tie STDOUT to a self defined package. However if you use 'print' in method 'PRINT' it becomes recursive. I have given up on this.

The only solution with which I can come up is to open the program as a pipe from an other script. This is my ad hoc very unpolished solution:
my $what=shift; use IPC::Open3; use IO::Handle; use threads; unlink('out.txt'); print "Going to run $what.n"; $pid = open3( \*CHILD_IN, \*CHILD_OUT, \*CHILD_ERR, "perl.exe $what" ) +; autoflush CHILD_OUT; autoflush CHILD_ERR; threads->create(\&handle_child_out)->detach; threads->create(\&handle_child_err)->detach; while(1){}; sub handle_child_out { do { sysread CHILD_OUT, $content, 10; if($content ne '') { print "$content"; open OUT,'>>out.txt'; print OUT $content; close OUT; } } while(1); } sub handle_child_err { do { sysread CHILD_ERR, $content, 10; if($content ne '') { print "$content"; open OUT,'>>out.txt'; print OUT $content; close OUT; } } while(1); }

Replies are listed 'Best First'.
Re^3: Both print and redirect STDOUT and STDERR
by Jenda (Abbot) on Feb 10, 2012 at 14:28 UTC

    IO::Tee then.

    Jenda
    Enoch was right!
    Enjoy the last years of Rome.

      IO::Tee won't install on Windows (or at least I'm not able to install it). However I played around with the GNU tee utility for Windows and arrived at this:
      tee |cmd.exe |tee -a tee.txt
      The above accepts input from keyboard, make cmd.exe act on it and also print and append output to tee.txt.

        According to CPAN Testers Matrix you should be able to install it. Are you sure it's not in PPM?

        Jenda
        Enoch was right!
        Enjoy the last years of Rome.