Perl,@array在Perl构造函数中的含义是什么?

5

我编写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;

我希望能够通过$this->tab访问一个@tab,但我不想将其作为参数传递给实例。
在Perl中这是如何实现的?
谢谢。

你想做什么?你想要一个作为 $this 的一部分,但不传递给 new() 的 @tab 吗?您希望将其创建为空表,以便稍后可以将其用作 $this->tab 吗? - AAT
@AAT:是的,我想要一个@tab作为$this的一部分,并且我不会传递一个在实例化时创建的空数组到new()。我可以通过$this->tab访问。谢谢。 - eouti
3个回答

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

谢谢,这就是我需要的。如何访问 i 元素?print $this->{"tab"}[i] - eouti
对于哈希表,是否也可以做到这一点?"tab" => {} - eouti
@eouti -- 1) 应该就是这样了。2) 是的,没错。你的 $this 本身只是一个匿名哈希表的引用,而且这个哈希表里面也可以包含其他以同样方式创建的哈希表的引用。 - AAT
@eouti:如何创建Perl数据结构并引用它们,您可以在这里阅读:https://dev59.com/an_aa4cB1Zd3GeqP6awl#35792849 - Eugen Konkov

3
考虑使用Moose来满足你的Perl面向对象编程需求。
我创建了一个包含Array trait委托属性的Moose版本对象,其中包括委托方法的柯里化。Moose提供了一种简单的方式来生成强大的封装类,而不需要编写大量的样板文件。
我创建了一个名为Pack的类,其属性包括:nomnbportsgiotabnom是只读字符串,创建对象时必须提供。 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

请尝试以下操作:

sub set_tab {
my ($self, @tab) = @_;
$self->{ tab } = \@tab;
}

2
为了完整起见,我会添加 perldoc perldsc - Dallaylaen
还有 sub get_tab { my $this = shift; return @{ $this->{tab} }; } - Dallaylaen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接