Andrew Kennard wrote:
> Hi all
> 
> I've got the basic hang of scope of vars in Perl which is a bit
> different to other languages I've used.
> 
> Having split a large program into packages I would like to use a
> global var across multiple packages. Perl does not seem to have a 'C'
> type 'extern' command to say a var is declared in another package.
> Perhaps it does not need one ? Would I be correct in thinking that
> the %DataFromHTMLPage in the following example would always be
> pointing to the same bit of memory across the packages ?

Yes, because you've used the Export module, which works in conjunction with
"use" to provide "sharing" of global variables.

All package (aka "global", or "symbol table") variables have a
"fully-qualified" name, of the format PackageName::SymbolName. So the "full"
name of your hash is:

   %myglob::DataFromHTMLPage

You can unambiguously reference that hash from any package by using its
fully qualified name. If you leave off the package name and just write
%DataFromHTMLPage, then the *current* package is used.

Because of the 3 lines beginning with "require Exporter", when you "use
myglob" from another package, Exporter creates an "alias" to the variable
back in package myglob.

So, if you have the following:

   package Foo;
   use strict;
   use myglob;
   print keys %DataFromHTMLPage;

The last line is referencing the hash %Foo::DataFromHTMLPage. However,
because of the Exporter stuff within myglob.pm, %Foo::DataFromHTMLPage is
actually an alias to %myglob::DataFromHTMLPage. So the two packages are now
"sharing" the same hash.

> 
> "myglob.pm"
> package myglob;
> use strict;
> use CGI::Carp qw(fatalsToBrowser);
> require    Exporter;
> our @ISA     = qw(Exporter);
> our @EXPORT  = qw(%DataFromHTMLPage);
> our %DataFromHTMLPage;
> ---------------------------------
> "myscript.pl"
> use strict;
> use CGI::Carp qw(fatalsToBrowser);
> use myglob;
> use mypkg1;
> use mypkg2;
> 
> # load data into %DataFromHTMLPage and do stuff with it
> --------------------------------------
> "mypkg1.pm"
> package mypkg1;
> use strict;
> use CGI::Carp qw(fatalsToBrowser);
> use myglob;
> #Do stuff here with %DataFromHTMLPage using functions etc
> -----------------------------------------
> "mypkg2.pm"
> package mypkg2;
> use strict;
> use CGI::Carp qw(fatalsToBrowser);
> use myglob;
> #Do stuff here with %DataFromHTMLPage using functions etc
> 
> 
> If I don't "use myglob" in the package files then strict causes an
> error to say that %DataFromHTMLPage is undefined.

Yes, because variables imported (via Exporter) get a "free pass" from use
strict.

> 
> My main question is if you define a var with 'our' if there is a
> 2nd/3rd occurance of the definition of it what happens ?

Nothing really. "our" is just a declaration that says "let me use this
variable name without the full package qualifier from here to the end of the
enclosing block or file".

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>


Reply via email to