Introduction to mod_perl (part 4): Perl Basics - Using Exporter.pm to Share Global Variables (Page 4 of 9 )
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;
BEGIN {
use Exporter ();
@My::HTML::ISA = qw(Exporter);
@My::HTML::EXPORT = qw();
@My::HTML::EXPORT_OK = qw($q);
}
use vars qw($q);
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;
BEGIN {
use Exporter ();
@My::HTML::ISA = qw(Exporter);
@My::HTML::EXPORT = qw();
@My::HTML::EXPORT_OK = qw($q);
}
use vars qw($q);
use My::Doc qw($q);
sub printmyheader{
# Whatever you want to do with $q... e.g.
print $q->header();
My::Doc::printtitle('Guide');
}
1;
My/Doc.pm
----------------
package My::Doc;
use strict;
BEGIN {
use Exporter ();
@My::Doc::ISA = qw(Exporter);
@My::Doc::EXPORT = qw();
@My::Doc::EXPORT_OK = qw($q);
}
use vars qw($q);
sub printtitle{
my $title = shift || 'None';
print $q->h1($title);
}
1;
Next: Using the Perl Aliasing Feature to Share Global Variables >>
More Perl Articles
More By Stas Bekman