On Wed, 2003-08-06 at 04:50, Steve Bannerman wrote:
> However, it doesn't really explain why the "root problem" exists.  The way I
> think about it, the creation of a new CGI "object" should create a new "set
> of slots" for instance data.

That would make sense, but very little about CGI.pm actually works in
the way you would expect.  It's a very bizarre module because of the
dual functional and object interface, and it uses lots of globals even
if you are only calling the OO interface.  If possible, I would suggest
you consider using CGI::Simple instead, which is a drop-in replacement.

> Maybe I don't understand the "object paradigm" in perl correctly; however, I
> do understand it very well in general.  Thus, it seems like a defect in
> either perl (the language) or CGI.pm.

It's a problem with CGI.pm, not with your understanding of Perl OO.

I believe I see the source of your troubles in the code that you
posted.  You are creating a closure by using a lexical variable and then
accessing it from within a sub.  This is a no-no with any long-running
system like mod_perl.  You can get away with it in a standard CGI
environment (or PerlRun) because it just exits after each request
instead of running the same code again.

Here is the offending section:

my $cgi = new CGI;
&saveFile();

sub saveFile {
  my $inputfile = $cgi->param('file');
... etc ...
}

Change it to this:

my $cgi = new CGI;
saveFile($cgi);

sub saveFile {
  my $cgi = shift;
  my $inputfile = $cgi->param('file');
... etc ...
}

I think that will do it.

- Perrin

Reply via email to