如何在另一个模块中使用哈希

时间:2010-06-24 11:57:28

标签: perl

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 个答案:

答案 0 :(得分:14)

良好的编程习惯规定您不允许外国代码直接混淆模块的数据,而是必须通过中介,例如访问者例程。

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)

驼鹿

模块

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)

子::导出

模块

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)

答案 1 :(得分:6)

变量需要属于一个包才能导出它们。如果使用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();

答案 2 :(得分:5)

首先,你不能使用“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
相关问题