http://www.perlmonks.org?node_id=33584


in reply to How to preserve the value of STDIN

If you can copy STDIN before anything reads from it, you might have luck. The following code works for me under Linux:
#!/usr/bin/perl -w use strict; open (NEWIN, "<&STDIN") or die "$!"; open (STDIN, "/dev/null"); print while (<NEWIN>);
I saved it as 'dup.pl' and called it with cat dup.pl | ./dup.pl.

(Find out about <& at open.)

Of course, you can pass a reference to a typeglob containing the NEWIN fh to the CGI.pm constructor...

Replies are listed 'Best First'.
RE: Re: How to preserve the value of STDIN
by Fastolfe (Vicar) on Sep 22, 2000 at 03:10 UTC
    This is still only a one-shot deal. <STDIN> now immediately returns an EOF (since we're reading from /dev/null now) as will any subsequent read from <NEWIN> (since we've read everything from what was once STDIN). We're not gaining anything here, in other words. He needs his in-house stuff to parse STDIN *as well* as CGI.pm. Both of them are written to read from STDIN, and only the first will succeed.

    If this were a normal file handle, we could seek(STDIN, 0, 0) to return it to a sane, starting state, but you can't do this with STDIN, because it's actually more like a pipe than a file.