如何在perl中的对象内创建对象列表?

Die*_*ira 1 perl module class list object

我是Perl的新手,对不起我的愚蠢问题.

我搜索了但是我没有找到办法做到这一点.

我创建了一个类,一个属性需要是一个对象列表,我需要稍后调用此列表.

我试图将列表中的对象推送到收到消息的列表中:

匿名哈希中奇数个元素...

我的包裹

package Squid;

use strict;
use warnings;

sub new
{
  my $class = shift;
  my $self = {@_ };

  print "Creating new $class\n";

  $self->{'filas'} = [];

  bless ($self, $class);

  return $self;
}

1;
Run Code Online (Sandbox Code Playgroud)

这是脚本:

use Squid;
use warnings;
use strict;


my $fila = FilaSquid->new("nome" => 'Fila 1', "profundidade" => 45);
my $fila2 = FilaSquid->new("nome" => 'Fila 2', "profundidade" => 7);

my $squid = Squid->new("versao" => '1.0', "origem" => 'C:\temp', "filas" => @filas);

print "\nA versao da fila eh ".$squid->{versao};
print "\nA origem da fila eh ".$squid->{origem}."\n";

foreach my $line ($squid->{filas}) {
    print $line->{nome}."\n";
}
Run Code Online (Sandbox Code Playgroud)

Sch*_*ern 6

第一个问题是这个new.

$self->{'filas'} = [];
Run Code Online (Sandbox Code Playgroud)

您正在初始化$self->{'filas'}为空数组引用.这将吹走任何通过的东西new.你可能想要的是:

$self->{filas} //= [];
Run Code Online (Sandbox Code Playgroud)

这与以下相同:

$self->{filas} = $self->{filas} // [];
Run Code Online (Sandbox Code Playgroud)

//是"定义或"运算符.这说只是初始化,$self->{filas}如果它是未定义的.它比使用更安全,||=因为有一些有效的东西是假的.


第二个问题是,你是如何传递filasnew.您正在$self->{filas}使用数组引用进行初始化是您的线索.

my @filas = (1, 2, 3, 4, 5, 6);

my $squid = Squid->new(
    "versao" => '1.0',
    "origem" => 'C:\temp',
    "filas" => @filas
);
Run Code Online (Sandbox Code Playgroud)

这就像说:

my $squid = Squid->new(
    "versao" => '1.0',
    "origem" => 'C:\temp',
    "filas" => 1,
    2, 3, 4, 5, 6
);
Run Code Online (Sandbox Code Playgroud)

你只是把一大堆东西放在了应该是一个偶数大小的列表的末尾,用作哈希.

=>运营商基本上是一样的逗号.它不会创建对,它只允许您在左侧的字符串周围省略引号.key => @values不是一对,它是key => $values[0], $values[1], $values[2], ....new试图将该列表视为散列,只要有偶数个元素它就会"起作用".

相反,您需要传入数组引用.key => \@values.

my $squid = Squid->new(
    "versao" => '1.0',
    "origem" => 'C:\temp',
    "filas" => \@filas
);
Run Code Online (Sandbox Code Playgroud)