On Thu, 27 May 2004, Tom Schindl wrote:

> Nathanial P. Hendler wrote:
> > I'm not sure if this is a style or function question.  I'd like to have a
> > module called Debug.pm that has a variable in it that if set to '1' by
> > anything (main script, or other modules) will print debug messages.
> >
> > Reading the Orielly "Practical mod_perl" I thought it was clear what I
> > needed to do, but I am finding it difficult.  The following works as one
> > file, but when I break the Debug part into its own file, the value of $D
> > just increments with every re-load...
> >
> > #!/usr/local/bin/perl
> >
> > use strict;
> > use warnings;
> > use CGI qw(:standard);
> > use Debug;
> >
> > print header();
> >
> > Debug::report('I should not see this line');
> > $Debug::D++;
> > Debug::report('I should see this line');
> > $Debug::D++;
> > Debug::report('This one too');
> >
> > package Debug;
> > use strict;
> > use warnings;
> >
> > use vars qw($D);
> > $D = 0;
> >
> > sub report {
> >     my $string = shift;
> >
> >     print "DEBUG ($D): $string<br>\n" if $D;
> > }
> >
> > 1;
> >
> >
> > Can anyone explain to me why I can't have a global variable when I put
> > Debug into its own file?
> >
>
> Well that's mod_perl. It will compile your script only once perl
> forked-process|thread (which means it also loads your Debug.pm only
> once) hence all global variables hold their value.
>
> This means the following:
> * you should see:
>    ---------------8<---------------
>    I should see this line
>    This one too
>    ---------------8<---------------
>    when the request is served by new forked/thread process which has not
>    already loaded your YourModule.pm.
> * you should see :
>    ---------------8<---------------
>    I should not see this line
>    I should see this line
>    This one too
>    ---------------8<---------------
>    on any next request servered by *exactly this* apache-child.
>
> What you could do:
> * reset $Debug::D directly before print header()
>    e.g. Debug::reset()
> * make an object out of debug:
>    e.g. $debug = new Debug(), $debug->increment_counter()
> * use mod_perls logging capabilities.

Ok, thanks.  The reason I haven't just made it an object is that I have
several modules, and I'd like them all to be able to call Debug::report()
and if the debug value ($D) is set, then it works, without having to pass
the debug object to every module.

I guess I just don't quite know how to do that.  Is there a way to have a
module run anycode any time another perl module/script uses it?

  use Debug;

would executed insided Debug.pm

 IM_BEING_USED {
     $D = 0;
 }

> Do you want to increase/decrease verbosity or why are you incrementing
> $D????

So that a module can do `$D++; blah blah; $D--;` and it won't trounce
another module's initiation to turn on debuging.

Thanks for your help.

Nathan


-- 
Report problems: http://perl.apache.org/bugs/
Mail list info: http://perl.apache.org/maillist/modperl.html
List etiquette: http://perl.apache.org/maillist/email-etiquette.html

Reply via email to