我编写了perl类,但我不知道如何在$this
变量中使用数组或哈希?
我有pack.pm
:
#!/usr/bin/perl -w
use strict;
use Parallel::ForkManager;
package Pack;
our $cgi = new CGI;
sub new {
my ($classe, $nom, $nbports, $gio) = @_;
my $this = {
"nom" => $nom,
"nbports" => $nbports,
"gio" => $gio
};
bless($this, $classe);
return $this;
}
...
1;
我希望有一个@tab
,我可以通过$this->tab
访问,但我不想将其作为arg提供给实例。
它在Perl中是如何工作的?
感谢。
答案 0 :(得分:4)
鉴于你对我的评论的回答,我认为你想要
my($this) = {
"nom" => $nom,
"nbports" => $nbports,
"gio" => $gio,
"tab" => []
};
即。将$ this-> {tab}设置为对新匿名数组的引用。
现在您可以根据需要引用它,例如
$this->{"tab"}[0] = "new value";
print "Table contains ", scalar(@{$this->{"tab"}}), "entries\n";
答案 1 :(得分:3)
考虑使用Moose来满足您的OO Perl需求。
我创建了一个对象的Moose版本,其中包含一个属性,该属性具有包含数组特征委派的属性,包含委托方法的干扰。 Moose提供了简单的方法来生成功能强大的封装类,而无需编写大量的样板文件。
我创建了一个类Pack
,其中包含以下属性:nom
,nbports
,gio
和tab
。
nom
是一个只读字符串,在创建对象时是必需的。
nbports
是只读整数值,未提供时默认为32。
gio
是一个可选的读写布尔值。
tab
是一个字符串数组。已为tab
:
all_tabs
会返回tabs
add_tab
将值推送到tabs
tab_count
返回tabs
alpha_tabs
会返回tabs
字母顺序turn_tabs
返回tabs
中的字符串列表,但字母反向显示任何设置属性的尝试都要检查类型是否正确。
Moose使用以下代码创建支持这些复杂行为的所有必需方法:
package Pack;
use Moose;
has 'nom' => (
is => 'ro',
isa => 'Str',
required => 1,
);
has 'nbports' => (
is => 'ro',
isa => 'Int',
default => 32,
);
has 'gio' => (
is => 'rw',
isa => 'Bool',
predicate => 'has_gio',
);
has 'tab' => (
traits => ['Array'],
is => 'ro',
isa => 'ArrayRef[Str]',
default => sub {[]},
handles => {
all_tabs => 'elements',
add_tab => 'push',
turn_tabs => [ 'map', sub { reverse } ],
tab_count => 'count',
alpha_tabs => [ 'sort', sub { lc($a) cmp lc($b) } ],
},
);
__PACKAGE__->meta->make_immutable;
no Moose;
1;
可以这样使用:
my $p = Pack->new( nom => 'Roger', tab => [qw( fee fie foe fum )] );
my $gio_state = 'UNSET';
if( $p->has_gio ) {
$gio_state = $p->gio ? 'TRUE' : 'FALSE';
}
print "GIO is $gio_state\n";
my @turned = $p->turn_tabs; # eef eif eof muf
$p->add_tabs( 'faa', 'fim' );
my @sorted = $p->alpha_tabls; # faa fee fie fim foe fum
my $count = $p->tab_count; # 6
my $ports = $p->nbports; # 32
答案 2 :(得分:2)
尝试:
sub set_tab {
my ($self, @tab) = @_;
$self->{ tab } = \@tab;
}