HalNineThousand has asked for the wisdom of the Perl Monks concerning the following question:

While this is about file handles, it involves the module Expect. I have been using a log file for Expect and I can specify the logfile with

$expect->log_file("logfile.log", "w")
I know the different uses of this, so my question isn't about starting logfiles. I know I can also pass a file handle where I use "logfile.log."

What I'd like to do is read the data that comes in from Expect and is sent out to the logfile in another part of the program, so I can do some work on it. I know there are ways of getting the data, but it would be easier if I could pass Expect a filehandle for the logfile, then, in the other part of the program, just read from that filehandle.

I would love it if I could basically intercept what goes through the filehandle, but if the other routine in the program had to read from it, then write the same text to a file, I could handle that, too.

Is there any way, if a filehandle is used for writing to a file, to read that data in another part of the program as (or after) that data is written to the file?

I considered just reading the file, but it's at least 8K behind what Expect is working on, due to buffers (it's running on Linux, if that makes a difference).

Thanks for any help or thoughts!

Replies are listed 'Best First'.
Re: File Handles -- Sharing Output
by BrowserUk (Patriarch) on Oct 08, 2010 at 19:29 UTC

    Use pair. On *nix you could probably use fork instead of a thread:

    #! perl -slw use strict; use threads; pipe \*RLOG, \*WLOG; my $oldfh = select(*WLOG); $| = 1; select($oldfh); ## pass the write handle WLOG to expect async{ ## simulate expect my $i; while( sleep 1 ) { print WLOG "output line" . ++$i; } }; open LOG, '>', 'nul' or die; ## The real logfile here ## read from the read handle RLOG, and write to the real log while( <RLOG> ) { print; ## Inspect the output print LOG; ## and then log it for real }

    Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
    "Science is about questioning the status quo. Questioning authority".
    In the absence of evidence, opinion is indistinguishable from prejudice.