Perl 如何使哈希在另一个模块中可用
首先,您不能使用“my”来声明它,因为它声明的是词汇变量,而不是包变量。使用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 ;
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
对吗?