for Ex :
package test1 ;
my %hash = ( a=> 10 , b => 30 ) ;
1;
in Script :
use test1 ;
print %hash ; # How to make this avilable in script without sub
Good programming practice prescribes that you do not allow foreign code to mess with a module's data directly, instead they must go through an intermediary, for example an accessor routine.
TIMTOWTDI, with and without exporting. The Moose example appears quite long, but this one also allows setting data as opposed to just reading it from Test1
, where the other three examples would need quite some additional code to handle this case.
Module
package Test1;
{
my %hash = (a => 10, b => 30);
sub member_data { return %hash; }
}
1;
Program
use Test1 qw();
Test1::member_data; # returns (a => 10, b => 30)
Module
package Test1;
use Moose;
has 'member_data' => (is => 'rw', isa => 'HashRef', default => sub { return {a => 10, b => 30}; });
1;
Program
use Test1 qw();
Test1->new->member_data; # returns {a => 10, b => 30}
# can also set/write data! ->member_data(\%something_new)
Module
package Test1;
use Sub::Exporter -setup => { exports => [ qw(member_data) ] };
{
my %hash = (a => 10, b => 30);
sub member_data { return %hash; }
}
1;
Program
use Test1 qw(member_data);
member_data; # returns (a => 10, b => 30)
Module
package Test1;
use parent 'Exporter';
our @EXPORT_OK = qw(member_data);
{
my %hash = (a => 10, b => 30);
sub member_data { return %hash; }
}
1;
Program
use Test1 qw(member_data);
member_data; # returns (a => 10, b => 30)
First thing is that you can't declare it using "my", as that declares lexical, not package, variables. Use our
to let you refer to a package variable and assign it the value you want. Then in your other package, prefix the name of the variable with the name of the first package. use
isn't like a C# using
statement, as it doesn't import symbols from the other package, it just makes them available.
Something like this should work to demonstrate:
use strict;
use warnings;
package test1;
our %hash = ( a=> 10 , b => 30 ) ;
package test2;
print $test1::hash{a} ; #prints 10
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With