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