Using Exporter.pm to Share Global Variables - Perl
Now that you have mod_perl installed, you can move on to learning how to use it. This article will run you through some basic Perl concepts to start with.
Assume that you want to share the CGI.pm object (I will use $q)between your modules. For example, you create it in script.pl, butyou want it to be visible in My::HTML. First, you make $qglobal.
script.pl:
----------------
use vars qw($q);
use CGI;
use lib qw(.);
use My::HTML qw($q); # My/HTML.pm is in the same dir as script.pl
$q = CGI->new;
My::HTML::printmyheader();
Note that I have imported $q from My::HTML. And My::HTML doesthe export of $q:
My/HTML.pm
----------------
package My::HTML;
use strict;
sub printmyheader{
# Whatever you want to do with $q... e.g.
print $q->header();
}
1;
So the $q is shared between the My::HTML package andscript.pl. It will work vice versa as well, if you create theobject in My::HTML but use it in script.pl. You have truesharing, since if you change $q in script.pl, it will be changedin My::HTML as well.
What if you need to share $q between more than two packages? Forexample you want My::Doc to share $q as well.
You leave My::HTML untouched, and modify script.pl to include:
use My::Doc qw($q);
Then you add the same Exporter code that I used in My::HTML,into My::Doc, so that it also exports $q.
One possible pitfall is when you want to use My::Doc in bothMy::HTML and script.pl. Only if you add
use My::Doc qw($q);
into My::HTML will $q be shared. Otherwise My::Doc will notshare $q any more. To make things clear here is the code:
script.pl:
----------------
use vars qw($q);
use CGI;
use lib qw(.);
use My::HTML qw($q); # My/HTML.pm is in the same dir as script.pl
use My::Doc qw($q); # Ditto
$q = new CGI;
My::HTML::printmyheader();
My/HTML.pm
----------------
package My::HTML;
use strict;