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
答案 0 :(得分:14)
良好的编程习惯规定您不允许外国代码直接混淆模块的数据,而是必须通过中介,例如访问者例程。
TIMTOWTDI,有和没有出口。 Moose示例看起来很长,但是这个示例还允许设置数据,而不是从Test1
读取数据,其他三个示例需要一些额外的代码来处理这种情况。
模块
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