How can I share global values among different packages in Perl?
global-variables, perl
Solution
There's already a standard Config module, so choose a different name.
Say you have `MyConfig.pm` with the following contents:
package MyConfig;
our $Foo = "bar";
our %Baz = (quux => "potrzebie");
1;
Then other modules might use it as in
#! /usr/bin/perl
use warnings;
use strict;
use MyConfig;
print "Foo = $MyConfig::Foo\n";
print $MyConfig::Baz{quux}, "\n";
If you don't want to fully qualify the names, then use the standard Exporter module instead.
Add three lines to `MyConfig.pm`:
package MyConfig;
require Exporter;
our @ISA = qw/ Exporter /;
our @EXPORT = qw/ $Foo %Baz /;
our $Foo = "bar";
our %Baz = (quux => "potrzebie");
1;
Now the full package name is no longer necessary:
#! /usr/bin/perl
use warnings;
use strict;
use MyConfig;
print "Foo = $Foo\n";
print $Baz{quux}, "\n";
You could add a read-only scalar to `MyConfig.pm` with
our $READONLY;
*READONLY = \42;
This is documented in perlmod.
After adding it to `@MyConfig::EXPORT`, you might try
$READONLY = 3;
in a different module, but you'll get
Modification of a read-only value attempted at ./program line 12.
As an alternative, you could declare in `MyConfig.pm` constants using the constant module and then export those.
Problem
Is there a standard way to code a module to hold global application parameters to be included in every other package? For instance: `use Config;`? A simple package that only contains `our` variables? What about readonly variables?