http://qs1969.pair.com?node_id=11194


in reply to CGI.pm Caching Issue

Are you running under mod_perl or PerlEx?

From a quick glance at the CGI.pm source, it looks like it calls _reset_globals for each new object, if you're running under either of those architectures (mod_perl or PerlEx). Since I believe both of them work similarly--ie. compiling a Perl interpreter into the web server and pre-compiling modules--this would imply that when you're doing "similar" things (only compiling CGI.pm once, or using persistent CGI objects), you'll need to call _reset_globals.

Ah, here it is: this is why you're getting that behavior. In the init subroutine, there's this code:

# if we get called more than once, we want to initialize # ourselves from the original query (which may be gone # if it was read from STDIN originally.) if (defined(@QUERY_PARAM) && !defined($initializer)) { foreach (@QUERY_PARAM) { $self->param('-name'=>$_,'-value'=>$QUERY_PARAM{$_}); } return; }
So this is initializing your object with the original query, rather than the new (and possibly different) one.

And what does _reset_globals do? It calls initialize_globals, which does this:

undef @QUERY_PARAM;
There you go. In persistent situations, then, (mod_perl or PerlEx), CGI.pm needs to clean up @QUERY_PARAM--you'll need to fake this in your persistent application, then.

Calling initialize_globals would be another option--plus it's not "private" (no "_"). :)