in reply to Re: Basic mod-perl question : why my variable is undefined ?
in thread Basic mod-perl question : why my variable is undefined ?

Yes you are right, "I" am exactly in this case, as mod_perl includes (automatically) my full script in a sub. So maybe it is my understanding of what is a "closure" or what is "lexically-scoped" which is bad.
I would have thought that as $x is defined in sub one, its scope goes until the end of sub one. I suppose I am wrong..? Why ? And is there a way to have a variable common to one and two, but declared inside one, as with mod_perl I have no access (at my knowledge) outside one... ?
  • Comment on Re^2: Basic mod-perl question : why my variable is undefined ?

Replies are listed 'Best First'.
Re^3: Basic mod-perl question : why my variable is undefined ?
by kennethk (Abbot) on Jul 23, 2014 at 16:22 UTC
    The problem with the demo code is that each subroutine is only compiled once. That means that the $x variable in two corresponds to the $x variable in the first call of one. The first instance of $x persists as there is a reference to it stored in two.

    Solutions include explicitly passing the value, forcing recompile each time through using a code reference (sub), swapping $x to a constant... What is the reason you aren't just passing in the value of $lig?


    #11929 First ask yourself `How would I do this without a computer?' Then have the computer do it the same way.

      OK, I understand. Yes, in this simple case, it will be the solution. But it is very complicated if you must pass all the variable without the possiblity to have common data. It becomes more complicated than a good old C program... I you add the mass of problems linked to UTF8, I ask me if PERL is still a good solution.... Shhht!
        As an old Fortran hack, I understand the issue of long function call lists, but I am concerned by the issues of common blocks and global variables far more acutely. The advantage Perl has over C in this regard is the ease of working with arrays, hashes and even objects. If your call-list is more than a handful of parameters, you should reconsider the design of your data structures.

        In any case, the posted pseudo-code could be updated to use a code ref and a closure in the following way:

        my $lig; ... $lig=4; print STDERR "ligA <<$lig>>\n"; my $xxxx = sub { ... print STDERR "ligX <<$lig>>\n"; }; print STDERR "ligB <<$lig>>\n"; $xxxx->();

        The code ref has identical scope to the lexical variable, so know you don't have the potential for cross-thread contamination.

        And I would very strongly disagree with the idea that Perl's handling of UTF-8 is problematic in comparison to any other language offering out there.


        #11929 First ask yourself `How would I do this without a computer?' Then have the computer do it the same way.