Как сделать хеш доступным в другом модуле - PullRequest
3 голосов
/ 24 июня 2010
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

Ответы [ 3 ]

14 голосов
/ 24 июня 2010

Хорошая практика программирования предписывает, чтобы вы не позволяли стороннему коду напрямую связываться с данными модуля, вместо этого они должны проходить через посредника, например подпрограмму доступа.

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)
6 голосов
/ 24 июня 2010

Переменные должны принадлежать пакету, чтобы их можно было экспортировать.Если вы объявите свой хеш с our вместо my, скрипт, использующий модуль, сможет получить доступ к хешу, используя его полное имя: %test1::hash.

Чтобы экспортировать символы еще удобнее, вы можете использовать Exporter .

# The module.
package Bubb;

use strict;
use warnings;

use base qw(Exporter); # As of Perl 5.10: `use parent ...`

our @EXPORT_OK = qw(bar %fubb);

sub bar { 'bar' }

our %fubb = (fizz => 1, buzz => 2);

1;

# The script.
use Bubb qw(bar %fubb);

При этом часто рекомендуется избегать такого экспорта переменных и всех проблем, связанных с глобальными переменными.

# The module.
# Basically the same as above, except this:
our @EXPORT_OK = qw(bar fubb);

sub fubb {
    return fizz => 1, buzz => 2;
}

# The script.
use Bubb qw(bar fubb);

my %fubb = fubb();
5 голосов
/ 24 июня 2010

Во-первых, вы не можете объявить это, используя «my», поскольку это объявляет лексические, а не пакетные переменные. Используйте our, чтобы позволить вам обратиться к переменной пакета и присвоить ей желаемое значение. Затем в вашем другом пакете префикс имени переменной с именем первого пакета. use не похож на оператор C # using, так как он не импортирует символы из другого пакета, он просто делает их доступными.

Примерно так должно работать, чтобы продемонстрировать:

use strict;
use warnings;

package test1; 

our %hash = ( a=> 10 , b => 30 ) ;

package test2;

print $test1::hash{a} ; #prints 10
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...