Hum... I'm puzzled.

According to this page:

http://docstore.mik.ua/orelly/weblinux2/apache/ch17_05.htm

One of the ways to avoid these kinds of problems is to:

"Put your code into modules as subroutines and call it from the main script - 
for some reason global variables in the module will be initialized"

But this is not what I am experiencing. It seems to me that module variables 
are NOT being reinitialized.

Towards the end of this email is a script (try_mode_perl.cgi) and a module 
(TryModPerl.pm) that I wrote to test how different types of variables get 
reinitialized or not.

When I run it say, 6 times, I get the output which is at the end of this email.

The section of the output that says:

---
$TryModPerl::package_var_noprefix=6
$TryModPerl::package_var_my=5
$TryModPerl::package_var_local=5
$TryModPerl::package_var_our=5
---

Seems to indicate that the package level variables are not getting 
reinitialized, whether they are declared in any of the following forms.

----
package TryModPerl;

$package_var_noprefix = 1;
my $package_var_my = 1;
local $package_var_local = 1;
our $package_var_local = 1;
----

Is this normal behavior? Note that I am running on Windows 7. 

Thx

Alain

=== try_mod_perl.cgi:
#!perl -w

use CGI;

$script_var_noprefix = 1;
my $script_var_my = 1;
local $script_var_local = 1;
our $script_var_our = 1;

sub run {

        my $cgi = CGI->new(); 
        print $cgi->header();
        print $cgi->start_html();

        print_various_vars($cgi);
        
        print $cgi->end_html();

}

sub print_various_vars {
        my ($cgi) = @_;
        my $txt =
                        "With a normal CGI environment, all the variables below 
should always have a value of 1.";
        print $cgi->p($txt);

        $txt = "But in a mod_perl environment, some of them may keep increase 
in value, because they are not reinitialized from one call to the next.";
        print $cgi->p("$txt");
        
        print "\$script_var_noprefix=$script_var_noprefix<br>\n";       
        print "\$script_var_my=$script_var_my<br>\n";   
        print "\$script_var_local=$script_var_local<br>\n";     
        print "\$script_var_our=$script_var_our<br>\n"; 
        print "<br>\n";

        $script_var_noprefix++;
        $script_var_my++;
        $script_var_local ++;
        $script_var_local ++;
        
        $script_sub_var_noprefix = 1;
        my $script_sub_var_my = 1;
        local $script_sub_var_local = 1;
        our $script_sub_var_our = 1;

        print "\$script_sub_var_noprefix=$script_sub_var_noprefix<br>\n";       
        print "\$script_sub_var_my=$script_sub_var_my<br>\n";   
        print "\$script_sub_var_local=$script_sub_var_local<br>\n";     
        print "\$script_sub_var_our=$script_sub_var_our<br>\n"; 
        print "<br>\n";

        $script_sub_var_noprefix ++;
        $script_sub_var_my ++;
        $script_sub_var_local ++;
        $script_sub_var_our ++;

        print 
"\$TryModPerl::package_var_noprefix=$TryModPerl::package_var_noprefix<br>\n";   
  
        print "\$TryModPerl::package_var_my=$TryModPerl::package_var_my<br>\n"; 
        print 
"\$TryModPerl::package_var_local=$TryModPerl::package_var_local<br>\n";   
        print 
"\$TryModPerl::package_var_our=$TryModPerl::package_var_our<br>\n";       
        print "<br>\n";

        $TryModPerl::package_var_noprefix++;    
        $TryModPerl::package_var_my++;  
        $TryModPerl::package_var_local++;       
        $TryModPerl::package_var_our++; 

        TryModPerl::print_various_vars($cgi);
}

run();

=== TryModPerl.pm:
package TryModPerl;

$package_var_noprefix = 1;
my $package_var_my = 1;
local $package_var_local = 1;
our $package_var_local = 1;

sub print_various_vars {
        my ($cgi) = @_;
        
        $package_sub_var_noprefix = 1;
        my $package_sub_var_my = 1;
        local $package_sub_var_local = 1;
        our $package_sub_var_our = 1;

        print "\$package_sub_var_noprefix=$package_sub_var_noprefix<br>\n";     
        print "\$package_sub_var_my=$package_sub_var_my<br>\n"; 
        print "\$package_sub_var_local=$package_sub_var_local<br>\n";   
        print "\$package_sub_var_our=$package_sub_var_our<br>\n";       
        print "<br>\n";

        $package_sub_var_noprefix++;
        $package_sub_var_my++;
        $package_sub_var_local++;
        $package_sub_var_our++;
}

1;

=== After 6 invocations, generates output:

With a normal CGI environment, all the variables below should always have a 
value of 1.

But in a mod_perl environment, some of them may keep increase in value, because 
they are not reinitialized from one call to the next.
$script_var_noprefix=1
$script_var_my=6
$script_var_local=1
$script_var_our=1

$script_sub_var_noprefix=1
$script_sub_var_my=1
$script_sub_var_local=1
$script_sub_var_our=1

$TryModPerl::package_var_noprefix=6
$TryModPerl::package_var_my=5
$TryModPerl::package_var_local=5
$TryModPerl::package_var_our=5

$package_sub_var_noprefix=1
$package_sub_var_my=1
$package_sub_var_local=1
$package_sub_var_our=1

Reply via email to