Arrays 在Perl类中定义2D数组

Arrays 在Perl类中定义2D数组,arrays,perl,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($sel

我是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;
}
我说了一个错误

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

谁能告诉我做这件事的正确方法是什么?我不想只是删除使用严格

您需要在$self散列中放置对数组的引用。现在,您正在标量上下文中放置一个array值,即其长度8。当然,你以后不能把它当作任何东西的参考

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

我把你的密码改成了你的初衷, 请参见更改的行和未注释的行

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

关于您的my@board=[];与=[],;将perl调用的数组的第一个元素是对@board数组的引用的列表分配给@board,但这并不是导致代码失败的原因,因为您覆盖了这个空数组引用分配并将其分配给零位置。
@board是一个列表,不是对它的引用,因为$self->{board}expect

其他人已经向您解释了构造函数的问题所在。我要补充的是,您可以通过省略$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];
}

你有没有考虑过用它来写你的课程?这会让你的生活更轻松。特别是,它似乎非常适合您的问题。

但如果我不想更改该值,该怎么办?每次我想做一些临时更改时都必须复制它吗?在子例程中访问它的正确方式应该是什么?@LouisKwong你能解释一下你的第一个问题吗?关于第二个问题,您应该为特定字段定义访问器,这样就可以转到$obj->tile$x,$y,其中tile是板中的一个字段。欢迎使用Stack Overflow和Perl标记。这是一个非常好的第一个答案!确保内联代码的格式一致,并可能添加到文档的链接。继续努力!:我根据您的代码版本1进行了更改,但当我尝试在子例程中访问它时,仍然出现相同的错误。哦,我似乎发现了问题,我尝试直接在子例程中使用$self->{board}[$I][$j],子例程中为空。但子例程难道不能访问它们自己类的属性吗?
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];
}