in reply to Usage of global variables

I also have a similar situation where I have many such constants (e.g., port numbers, database parameters, directory names) that are used by several modules and scripts. I usually create a module called Constants.pm, which contains all the constants:
# Constants.pm package Constants; use strict; use Exporter; our @ISA = qw(Exporter); # if you want to automatically import our @EXPORT = qw(%ABC $A); # or if you want to explicitly import our @EXPORT_OK = (); our $A = "A"; our %ABC = ("A"=>1,"B"=>2,"C"=>3); 1;
You can then just "use Constants" in other modules and scripts.

Replies are listed 'Best First'.
Re^2: Usage of global variables
by Anonymous Monk on Jan 04, 2005 at 09:47 UTC
    Thanks for all those comments. I have done it but i dont know how i have written the code somehow like this: The hash used here is just the declaration, it is defined dynamically.
    use strict; use vars qw(%line $time); use mod1 qw(%line); use mod2 qw(%line $time);
    in the main .pl file and in the .pm files it is like this
    use strict; use Exporter(); use vars qw(%line);
    in the mod1.pm, and
    use strict; use Exporter(); use vars qw(%line $time);
    in mod2.pm. Can any one explaing why and how is it working without giving any warnings.

    2005-01-04 Janitored by Arunbear - added code tags, as per Monastery guidelines

      You aren't getting warnings, but you aren't getting what you think you are here. It would help to see more code, and please use code tags. The first problem is that you weren't really exporting.
      package mod1; use strict; use vars qw(%line); use Exporter(); # The next two lines are vital for exporting. our @ISA = qw(Exporter); our @EXPORT_OK = qw(%line); BEGIN { %line = (this => "line"); } 1;
      package mod2; use strict; use vars qw(%line $time); use Exporter(); # Same with this one. our @ISA = qw(Exporter); our @EXPORT_OK = qw(%line $time); BEGIN { %line = (that => "line2"); $time = time(); } 1;
      You have one more problem. By exporting the same name in two modules, you will be clobbering your first one.
      use strict; use vars qw(%line $time); use mod1 qw(%line); use mod2 qw(%line $time); # This will print: # that,line2 print join(",",%line),"\n";
      If you really want both packages to have their own global named %line then don't export them. Use them with package names, like this: %mod1::line.