Perl,perl构造函数中的@array

时间:2011-05-16 08:13:41

标签: perl variables constructor instance

我编写了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中是如何工作的?

感谢。

3 个答案:

答案 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,其中包含以下属性:nomnbportsgiotab

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;
}