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.
===