in reply to Unusual problem with CGI based quiz

I'm guessing that you are running under mod_perl with the Apache::Registry module. If that is correct, then you are experiencing a classic problem with coding cgi style programs and running them under mod_perl.

I'd suggest reading the excellent mod_perl user's guide http://perl.apache.org/docs/1.0/guide/. You might start with the chapter "CGI to mod_perl Porting", and pay special attention to the section called "Global Variables Persistence".

Basically you want to use a lexically scoped variable (my $var;), scoped in manner that will go out of scope between each request.

Coding cgi style programs under mod_perl contains several traps for those who aren't very familiar with Perl's variable scoping (and closures). Personally I feel that coding regular mod_perl handlers is much more straight forward.

Ovid's comments are also very poignant.

-Colin.

WHITEPAGES.COM | INC

Replies are listed 'Best First'.
Re^2: Unusual problem with CGI based quiz
by sgifford (Prior) on Jul 06, 2005 at 20:38 UTC
    Just to elaborate a little bit, if you're running this script under mod_perl or similar, every time the script is executed it just executes the code again, exactly as it was typed. In this case, because you use global variables, every time through the script you push more questions onto your array, and it never gets reset. The best way to fix this is by using my variables:
    { my @allquestions; ... push(@allquestions,"question"); ... print @allquestions; }
    This will cause the variable to be newly created every time your code is called, which will make it start off empty.

    In general, all of your variables in a mod_perl script should be my variables, unless you've thought about it and you really want them to retain their values between runs.

    You should also consider running your code under use strict and use warnings, and you should definitely configure your mod_perl to use "taint mode", which will stop mistakes like the one Ovid pointed out from becoming crippling security holes.

      "The best way to fix this is by using my variables:
      { my @allquestions; ... push(@allquestions,"question"); ... print @allquestions; }
      This will cause the variable to be newly created every time your code is called, which will make it start off empty."
      If I use "my" within an "if" statement, doesn't this make it impossible for me to pass that variable to another script when I use a form and pass them via a hidden variable if the hidden variables are outside the if statement?
        Yes. If you need a global variable visible to your whole program but reset on every execution, just declare a global variable and reset it on every execution:
        our $variable; $variable = undef;