dcsimg

The Perl Basics You Need To Know Page 2

By Stas Bekman (Send Email)
Posted Aug 2, 2000


So the is shared between the My::HTML package and script.pl. It will work vice versa as well, if you create the object in My::HTML but use it in script.pl. You have true sharing, since if you change in script.pl, it will be changed in My::HTML as well.

What if you need to share between more than two packages? For example you want My::Doc to share as well.

You leave My::HTML untouched, and modify script.pl to include:


 use My::Doc qw();

Then you add the same Exporter code that I used in My::HTML, into My::Doc, so that it also exports .

One possible pitfall is when you want to use My::Doc in both My::HTML and script.pl. Only if you add

  use My::Doc qw();

into My::HTML will be shared. Otherwise My::Doc will not share any more. To make things clear here is the code:

  script.pl:
  ----------------
  use vars qw();
  use CGI;
  use lib qw(.); 
  use My::HTML qw(); # My/HTML.pm is in the same dir as script.pl
  use My::Doc  qw(); # Ditto
   = 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();
  
  }
  
  use vars     qw();
  use My::Doc  qw();
  
  sub printmyheader{
    # Whatever you want to do with ... e.g.
    print ->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();
  
  }
  
  use vars qw();
  
  sub printtitle{
    my  = shift || 'None';
    
    print ->h1();
  }
  1;
 

Using the Perl Aliasing Feature to Share Global Variables

As the title says you can import a variable into a script or module without using Exporter.pm. I have found it useful to keep all the configuration variables in one module My::Config. But then I have to export all the variables in order to use them in other modules, which is bad for two reasons: polluting other packages' name spaces with extra tags which increases the memory requirements; and adding the overhead of keeping track of what variables should be exported from the configuration module and what imported, for some particular package. I solve this problem by keeping all the variables in one hash %c and exporting that. Here is an example of My::Config:


  package My::Config;
  use strict;
  use vars qw(%c);
  %c = (
    # All the configs go here
    scalar_var => 5,
  
    array_var  => [qw(foo bar)],
  
    hash_var   => {
                   foo => 'Foo',
                   bar => 'BARRR',
                  },
  );
  1;



Comment and Contribute

Your name/nickname

Your email

(Maximum characters: 1200). You have characters left.