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

Tre*_*ree 3 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
Run Code Online (Sandbox Code Playgroud)

dax*_*xim 14

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

TIMTOWTDI,有和没有出口.Moose示例看起来很长,但是这个示例还允许设置数据而不是仅仅读取数据Test1,其他三个示例需要相当多的额外代码来处理这种情况.


unsugared

package Test1;
{
    my %hash = (a => 10, b => 30);
    sub member_data { return %hash; }
}
1;
Run Code Online (Sandbox Code Playgroud)

程序

use Test1 qw();
Test1::member_data; # returns (a => 10, b => 30)
Run Code Online (Sandbox Code Playgroud)

驼鹿

package Test1;
use Moose;
has 'member_data' => (is => 'rw', isa => 'HashRef', default => sub { return {a => 10, b => 30}; });
1;
Run Code Online (Sandbox Code Playgroud)

程序

use Test1 qw();
Test1->new->member_data; # returns {a => 10, b => 30}
# can also set/write data!  ->member_data(\%something_new)
Run Code Online (Sandbox Code Playgroud)

子::出口商

package Test1;
use Sub::Exporter -setup => { exports => [ qw(member_data) ] };

{
    my %hash = (a => 10, b => 30);
    sub member_data { return %hash; }
}
1;
Run Code Online (Sandbox Code Playgroud)

程序

use Test1 qw(member_data);
member_data; # returns (a => 10, b => 30)
Run Code Online (Sandbox Code Playgroud)

出口商

package Test1;
use parent 'Exporter';

our @EXPORT_OK = qw(member_data);

{
    my %hash = (a => 10, b => 30);
    sub member_data { return %hash; }
}
1;
Run Code Online (Sandbox Code Playgroud)

程序

use Test1 qw(member_data);
member_data; # returns (a => 10, b => 30)
Run Code Online (Sandbox Code Playgroud)


FMc*_*FMc 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);
Run Code Online (Sandbox Code Playgroud)

也就是说,通常建议避免这种变量的输出以及与全局变量一起出现的所有问题.

# 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();
Run Code Online (Sandbox Code Playgroud)


dso*_*ano 5

首先,你不能使用"我的"声明它,因为它声明了词法,而不是包,变量.使用our让您指的是包变量,并为其分配所需的值.然后在您的其他包中,使用第一个包的名称作为变量名称的前缀. use它不像C#using语句,因为它不会从其他包中导入符号,它只是使它们可用.

这样的事情应该有助于证明:

use strict;
use warnings;

package test1; 

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

package test2;

print $test1::hash{a} ; #prints 10
Run Code Online (Sandbox Code Playgroud)