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,其他三个示例需要相当多的额外代码来处理这种情况.
模
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)
变量需要属于一个包,以便它们可以导出.如果使用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)
首先,你不能使用"我的"声明它,因为它声明了词法,而不是包,变量.使用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)
| 归档时间: |
|
| 查看次数: |
8279 次 |
| 最近记录: |