Хорошая практика программирования предписывает, чтобы вы не позволяли стороннему коду напрямую связываться с данными модуля, вместо этого они должны проходить через посредника, например подпрограмму доступа.
TIMTOWTDI, с экспортом и без экспорта.Пример Moose выглядит довольно длинным, но этот также позволяет задавать данные, а не просто читать их из Test1
, тогда как для других трех примеров потребуется достаточно дополнительного кода для обработки этого случая.
unsugared
Модуль
package Test1;
{
my %hash = (a => 10, b => 30);
sub member_data { return %hash; }
}
1;
Программа
use Test1 qw();
Test1::member_data; # returns (a => 10, b => 30)
Moose
Модуль
package Test1;
use Moose;
has 'member_data' => (is => 'rw', isa => 'HashRef', default => sub { return {a => 10, b => 30}; });
1;
Программа
use Test1 qw();
Test1->new->member_data; # returns {a => 10, b => 30}
# can also set/write data! ->member_data(\%something_new)
Sub :: Exporter
Модуль
package Test1;
use Sub::Exporter -setup => { exports => [ qw(member_data) ] };
{
my %hash = (a => 10, b => 30);
sub member_data { return %hash; }
}
1;
Программа
use Test1 qw(member_data);
member_data; # returns (a => 10, b => 30)
Экспортер
Модуль
package Test1;
use parent 'Exporter';
our @EXPORT_OK = qw(member_data);
{
my %hash = (a => 10, b => 30);
sub member_data { return %hash; }
}
1;
Программа
use Test1 qw(member_data);
member_data; # returns (a => 10, b => 30)