modperl_declaration_problems_CGI_handles

This is part of The Pile, a partial archive of some open source mailing lists and newsgroups.



Subject: Problem with form data using mod_perl and CGI.pm
From: stevenl <stevenl@concentric.net>
Date: Sat, 12 Aug 2000 22:25:33 -0700

I am running Linux 2.2, Apache 1.3.12, mod_perl 1.24, and CGI.pm 2.70.

If I declare a CGI variable using 'my' (see below) and use mod_perl, I
encounter problems with POST data.  On subsequent entries in the form,
it continues to use the old data.

The problem does not appear if I don't use 'my' (and therefore, unable
to 'use strict'), or if I disable mod_perl from my httpd.conf file.

You can test this out with these files.  First, run 'httpd -X'.  Then
enter some data in the form.  On the next submit, the data is not
changed.

Note: The perl script displays the current HTML file plus what you
just entered.


htdocs/form.html
 ----------------
<html>
<head></head>

<body>
<form actioN="/cgi-bin/form.pl" method="post">
Name: 
<input type="text" name="Name" value="">
<input type="submit">
</form>

<!--ARGS-->

</body>
</html>


cgi-bin/form.pl
 ---------------
#!/usr/local/bin/perl -w

# Problem if declaring $query with 'my' and using
#   Apache 1.3.12, mod_perl 1.24, CGI.pm 2.70

use CGI;
my $query = new CGI;

print "Content-Type: text/html\n\n";

open(FD, "../htdocs/form.html") || die $!;
while (<FD>) {
	if (/^<!--ARGS-->$/) {
		printQueryParams();
	}
	else { print; }
}
close(FD);

sub printQueryParams
{
	my @params = $query->param();

	my ($arg, $val);
	foreach $arg (@params) {
		$val = $query->param($arg);
		print "$arg = $val<BR>\n";
	}
}



-Steven

===

Subject: Re: Problem with form data using mod_perl and CGI.pm
From: stevenl <stevenl@concentric.net>
Date: Mon, 14 Aug 2000 01:08:48 -0700

Jie Gao wrote:
> 
> On Sat, 12 Aug 2000, stevenl wrote:
> 
> > I am running Linux 2.2, Apache 1.3.12, mod_perl 1.24, and CGI.pm 2.70.
> >
> > If I declare a CGI variable using 'my' (see below) and use mod_perl, I
> > encounter problems with POST data.  On subsequent entries in the form,
> > it continues to use the old data.
> >
> > The problem does not appear if I don't use 'my' (and therefore, unable
> > to 'use strict'), or if I disable mod_perl from my httpd.conf file.
> >
> > You can test this out with these files.  First, run 'httpd -X'.  Then
> > enter some data in the form.  On the next submit, the data is not
> > changed.
> >
> > Note: The perl script displays the current HTML file plus what you
> > just entered.
> > ...
> 
> http://perl.apache.org/guide/perl.html#my_Scoped_Variable_in_Nested_S

Thanks.  That seems to be the problem, accessing an outer lexical
variable in an inner subroutine.  I'm not quite sure I understand why
Perl behaves this way.  Java seems to handle this just fine with the
expected behavior.

I'm currently using:

use CGI;
my $query = new CGI();

What is the best way to define a global value like $query if I want to
'use strict'.  I really don't want to be passing $query to all my
subroutines.  I could package define it as $main::query but that seems
awkward.



===

Subject: Re: Problem with form data using mod_perl and CGI.pm
From: Stas Bekman <stas@stason.org>
Date: Mon, 14 Aug 2000 10:15:36 +0200 (CEST)

On Mon, 14 Aug 2000, stevenl wrote:

> Thanks.  That seems to be the problem, accessing an outer lexical
> variable in an inner subroutine.  I'm not quite sure I understand why
> Perl behaves this way.  Java seems to handle this just fine with the
> expected behavior.

Because Perl != Java. And you are lucky that the last statement
returns true :) Of course the real explanation would require some reading
from you.

===

Subject: RE: Problem with form data using mod_perl and CGI.pm
From: "Bryan McGuire" <joefriday@mindspring.com>
Date: Mon, 14 Aug 2000 05:04:19 -0500

perldoc perlref" addresses the nested subroutine problem, and
suggests using something like this:

  local *printQueryParams = sub {

instead of this:

  sub printQueryParams {

The assignment to the typeglob is pretty slick in that it let's you
call the anonymous subroutine as if it were a subroutine named
printQueryParams.

===


the rest of The Pile (a partial mailing list archive)

doom@kzsu.stanford.edu