RE: HTTP POST: parameters empty when usingModPerl::Registry(okay when using ModPerl:PerlRun)...

2003-08-14 Thread Steve Bannerman
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



RE: HTTP POST: parameters empty when usingModPerl::Registry(okay when using ModPerl:PerlRun)...

2003-08-14 Thread Perrin Harkins
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