Perrin,
Thanks...your explanation makes sense.
I was thinking of the subroutine as a method on a class and that the objects
in the class had a cgi instance associated with them. I was thinking in the
object paradigm rather than in the procedural paradigm.
Cheers
--
Steve Bannerman
[EMAIL PROTECTED]
44.(0)1865.273866
-Original Message-
From: Perrin Harkins [mailto:[EMAIL PROTECTED]
Sent: 07 August 2003 19:10
To: [EMAIL PROTECTED]
Cc: [EMAIL PROTECTED]
Subject: RE: HTTP POST: parameters empty when
usingModPerl::Registry(okay when using ModPerl:PerlRun)...
On Thu, 2003-08-07 at 03:36, Steve Bannerman wrote:
So with respect to your explanation about the long running
perl system, am
I to understand that the old version of the saveFile() subroutine uses a
reference to a different $cgi instance that the $cgi instance
in the main
body of the script?
It uses a reference to the $cgi variable that was in scope when
saveFile() was compiled.
As I said, I'm new to perl but that seems to be an awfully
strange behavior
of the language...if true, shouldn't the compilation (of the subroutine)
fail because it references an undeclared variable ($cgi)?
But it doesn't reference an undeclared variable; it references the
original $cgi that was available when the sub was compiled.
Closures are a feature of Perl. You can read about them in general in
perlfaq7 and the perlref man page:
http://www.perldoc.com/perl5.8.0/pod/perlfaq7.html#What's-a-closure-
http://www.perldoc.com/perl5.8.0/pod/perlref.html
Note that those both talk a lot about anonymous subs, but any sub can be
a closure if it refers to a lexical variable defined in an enclosing
scope.
There is some mod_perl specific stuff on this here:
http://perl.apache.org/docs/general/perl_reference/perl_reference.
html#my___Scoped_Variable_in_Nested_Subroutines
If you had warnings on, you would have received a message about $cgi not
staying shared.
In brief terms, what happens is that your program creates a lexical
called $cgi, then saveFile() refers to it, locking in that variable as
the $cgi that will always be referenced by saveFile(). At the end of
the script $cgi goes out of scope and disappears, but saveFile() keeps
referencing it.
In a CGI program this is not a problem, because Perl exits and the
process quits. In mod_perl, the code gets run again and saveFile()
still refers to the original $cgi.
There are a number of ways to solve this problem, but I prefer the one I
showed you. Explicitly passing all arguments to subs is well
established as a best practice in programming. What you were doing with
$cgi before is basically treating it as a global. So, I'd suggest you
turn on warnings, turn on strict, and embrace the good practice of
passing variables to your subs.
- Perrin