in reply to How to preserve the value of STDIN

Note that this would still destroy STDIN, but at least you have the data available to the two parts of your application that need it. They just need to be re-written to use <$A> and/or <$B> instead of <STDIN>.

You could actually even do without the 2nd variable:

my $A = new IO::String ($data); &exhaust_file_handle($A); # read everything from $A $A->setpos(0); # rewind &also_exhaust($A); # 2nd process reads everything from $A
Since $A isn't a native file handle, you can't seek() on it, but this will do just as well and should be indistinguishable from your two separate processes.

You will also need to do this in a BEGIN { } block, so that all of this mangling of STDIN is done before use CGI ($A) is called.