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

Perl 如何使哈希在另一个模块中可用,perl,Perl,首先,您不能使用“my”来声明它,因为它声明的是词汇变量,而不是包变量。使用our可以引用包变量并为其指定所需的值。然后在另一个包中,用第一个包的名称作为变量名称的前缀use不像C#using语句,因为它不从另一个包导入符号,它只是让符号可用 类似的内容应该能够证明: for Ex : package test1 ; my %hash = ( a=> 10 , b => 30 ) ; 1; in Script : use test1 ; print %hash ;

首先,您不能使用“my”来声明它,因为它声明的是词汇变量,而不是包变量。使用
our
可以引用包变量并为其指定所需的值。然后在另一个包中,用第一个包的名称作为变量名称的前缀
use
不像C#
using
语句,因为它不从另一个包导入符号,它只是让符号可用

类似的内容应该能够证明:

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

良好的编程实践规定,您不允许外来代码直接干扰模块的数据,相反,它们必须通过中介,例如访问器例程

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


无装饰 模块

use strict;
use warnings;

package test1; 

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

package test2;

print $test1::hash{a} ; #prints 10
use Test1 qw();
Test1::member_data; # returns (a => 10, b => 30)
use Test1 qw();
Test1->new->member_data; # returns {a => 10, b => 30}
# can also set/write data!  ->member_data(\%something_new)
use Test1 qw(member_data);
member_data; # returns (a => 10, b => 30)
节目

package Test1;
{
    my %hash = (a => 10, b => 30);
    sub member_data { return %hash; }
}
1;
package Test1;
use Moose;
has 'member_data' => (is => 'rw', isa => 'HashRef', default => sub { return {a => 10, b => 30}; });
1;
package Test1;
use Sub::Exporter -setup => { exports => [ qw(member_data) ] };

{
    my %hash = (a => 10, b => 30);
    sub member_data { return %hash; }
}
1;
package Test1;
use parent 'Exporter';

our @EXPORT_OK = qw(member_data);

{
    my %hash = (a => 10, b => 30);
    sub member_data { return %hash; }
}
1;

驼鹿 模块

use strict;
use warnings;

package test1; 

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

package test2;

print $test1::hash{a} ; #prints 10
use Test1 qw();
Test1::member_data; # returns (a => 10, b => 30)
use Test1 qw();
Test1->new->member_data; # returns {a => 10, b => 30}
# can also set/write data!  ->member_data(\%something_new)
use Test1 qw(member_data);
member_data; # returns (a => 10, b => 30)
节目

package Test1;
{
    my %hash = (a => 10, b => 30);
    sub member_data { return %hash; }
}
1;
package Test1;
use Moose;
has 'member_data' => (is => 'rw', isa => 'HashRef', default => sub { return {a => 10, b => 30}; });
1;
package Test1;
use Sub::Exporter -setup => { exports => [ qw(member_data) ] };

{
    my %hash = (a => 10, b => 30);
    sub member_data { return %hash; }
}
1;
package Test1;
use parent 'Exporter';

our @EXPORT_OK = qw(member_data);

{
    my %hash = (a => 10, b => 30);
    sub member_data { return %hash; }
}
1;

次级:出口商 模块

use strict;
use warnings;

package test1; 

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

package test2;

print $test1::hash{a} ; #prints 10
use Test1 qw();
Test1::member_data; # returns (a => 10, b => 30)
use Test1 qw();
Test1->new->member_data; # returns {a => 10, b => 30}
# can also set/write data!  ->member_data(\%something_new)
use Test1 qw(member_data);
member_data; # returns (a => 10, b => 30)
节目

package Test1;
{
    my %hash = (a => 10, b => 30);
    sub member_data { return %hash; }
}
1;
package Test1;
use Moose;
has 'member_data' => (is => 'rw', isa => 'HashRef', default => sub { return {a => 10, b => 30}; });
1;
package Test1;
use Sub::Exporter -setup => { exports => [ qw(member_data) ] };

{
    my %hash = (a => 10, b => 30);
    sub member_data { return %hash; }
}
1;
package Test1;
use parent 'Exporter';

our @EXPORT_OK = qw(member_data);

{
    my %hash = (a => 10, b => 30);
    sub member_data { return %hash; }
}
1;

出口商 模块

use strict;
use warnings;

package test1; 

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

package test2;

print $test1::hash{a} ; #prints 10
use Test1 qw();
Test1::member_data; # returns (a => 10, b => 30)
use Test1 qw();
Test1->new->member_data; # returns {a => 10, b => 30}
# can also set/write data!  ->member_data(\%something_new)
use Test1 qw(member_data);
member_data; # returns (a => 10, b => 30)
节目

package Test1;
{
    my %hash = (a => 10, b => 30);
    sub member_data { return %hash; }
}
1;
package Test1;
use Moose;
has 'member_data' => (is => 'rw', isa => 'HashRef', default => sub { return {a => 10, b => 30}; });
1;
package Test1;
use Sub::Exporter -setup => { exports => [ qw(member_data) ] };

{
    my %hash = (a => 10, b => 30);
    sub member_data { return %hash; }
}
1;
package Test1;
use parent 'Exporter';

our @EXPORT_OK = qw(member_data);

{
    my %hash = (a => 10, b => 30);
    sub member_data { return %hash; }
}
1;

变量需要属于包才能导出。如果使用
our
而不是
my
声明哈希,则使用模块的脚本将能够使用其完全限定名访问哈希:
%test1::hash

要更方便地导出符号,可以使用

也就是说,通常建议避免导出变量和所有与全局变量相关的问题

# 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);

+回答得好。我正在我的代码中使用你的方法。因为那就是我想做的!upvote是因为我想使用这样的方法,但是对我来说,由于奇怪的原因,它不起作用,它对变量起作用,但对哈希不起作用,当通过花括号以哈希方式访问哈希变量索引时,它总是返回undef,因为它返回的变量为1/8。对于我来说,是什么让我像使用标准变量一样使用它,并通过arrow
our$hash={},$test1::hash->{a}
访问对象的方式工作的?您已经阅读了
perldoc perltoot
perldoc perltooc
对吗?