在Perl类中定义2D数组

时间:2016-03-23 11:22:37

标签: arrays perl

我是Perl的新手,我正在尝试将一个2D数组定义为Perl中我的类的属性。我将我的课程定义如下,

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

my @board = [];
for (my $i = 0; $i < 8; $i++){
    for(my $j = 0; $j < 8; $j++){
        $board[$i][$j] = '.';
    }
}
$self->{board} = @board;
bless($self, $class);
return $self;
}

但是后来当我尝试像这样访问董事会领域时

$self->{board}[$i][$j] = ' ';

我说错误

Can't use string ("8") as an ARRAY ref while "strict refs" in use

谁能告诉我这样做的正确方法是什么?我不想只删除use strict。

3 个答案:

答案 0 :(得分:5)

我将您的代码更改为我确定您的意图, 看到更改的行并注释#not

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

my @board = ();  # not []
for (my $i = 0; $i < 8; $i++){
    for(my $j = 0; $j < 8; $j++){
        $board[$i][$j] = '.';
    }
}
$self->{board} = \@board; # not @board
bless($self, $class);
return $self;
}

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

my $board = []; # not @board
for (my $i = 0; $i < 8; $i++){
    for(my $j = 0; $j < 8; $j++){
        $board->[$i][$j] = '.';
    }
}
$self->{board} = $board; # not @board
bless($self, $class);
return $self;
}

关于你的my @board=[];=([],);相同,分配一个列表(perl调用ARRAY),其第一个元素是对ARRAY的引用,但是这不是导致代码失败的原因因为你覆盖了这个空数组引用分配并赋值给零。 @board是一个列表而不是对它的引用,因为$ self-&gt; {board} expect

答案 1 :(得分:1)

您需要在$self哈希中放置对数组的引用。现在你将数组的值放在标量上下文中 - 这是它的长度8。当然,你以后不能用它作为任何参考。

$self->{board} = \@board;

答案 2 :(得分:0)

其他人已经解释了构造函数的问题。我要补充一点,你可以省略$board变量并使用C风格的循环来简化它。

sub new {
  my $class = shift;

  my $self = {};
  $self->{board} = [];

  for my $i (1 .. 8) {
    for my $j (1 .. 8) {
      $self->{board}[$i][$j] = '.';
    }
  }

  return bless $self, $class;
}

我还添加了以下三种方法,可以更轻松地设置和获取电路板的元素:

sub board {
  my $self = shift;
  return $self->{board};
}

sub set_board_element {
  my $self = shift;
  my ($i, $j, $val) = @_;

  $self->board->[$i][$j] = $val;
}

sub get_board_element {
  my $self = shift;
  my ($i, $j) = @_;

  return $self->board->[$i][$j];
}

您是否考虑过使用Moose撰写课程?它会让你的生活更轻松。特别是,Array traits似乎非常适合您的问题。