in reply to seeking piped STDIO

Unfortunately, there is not much flexibility in how the script will be receiving its input. It must accept a stream that is piped to its standard input, without knowing the identity of the files that make up that stream. So the file handle that it has is the file handle for STDIO, which it would not want to close before passing.

The only way that the script can tell one file from the next in the incoming stream is by matching the identifying information that comes in the first line of each file. Then it needs to pass the STDIO filehandle to a subroutine to parse the file.

Replies are listed 'Best First'.
Re: seeking piped STDIO
by Dominus (Parson) on Nov 16, 2000 at 23:06 UTC
    In that case I can think of two things to do.

    1. Use a tied filehandle. The tied object will contain the line you already read, and the real filehandle. Pass the tied filehandle to the subroutine. When the subroutine tries to read the tied filehandle the first time, give it the line you already read. After that, give it data out of the real filehandle.

    2. Read all the data from standard input and save it to a temporary file, or several temporary files. Then use seek on the temporary file.

    Solutions 'outside the box' would include (3) redesigning the stupid subroutines that require a filehandle argument instead of a string argument, and (4) finding the person responsible for dumping all the file data insto a single stream in the first place, and hitting him with an ax.

      ... and (4) finding the person responsible for dumping all the file data into a single stream in the first place, and hitting him with an ax...
      I am in awe.. that was beautiful!
      instant ++ here! :)

      -brad..
      This solves my problem! Tying, though a bit laborious, looks to be a very clean solution. I believe it will solve another problem as well, which is that the subroutines expect an eof. The tied filehandle could supply that when it detects the start of the next file.

      Suggestion (4) is also intruiging. :)