Good programming practice prescribes that you do not allow the external code to directly communicate with the module data, instead they must go through an intermediary, for example, an access procedure.
TIMTOWTDI, with and without export. The Moose example looks pretty long, but it also allows you to set data, rather than just reading it from Test1, where the other three examples will require quite some additional code to handle this case.
unsugared
Module
package Test1;
{
my %hash = (a => 10, b => 30);
sub member_data { return %hash; }
}
1;
Program
use Test1 qw();
Test1::member_data;
Moose
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;
Sub :: exporter
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;
Exporter
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;
daxim source
share