使用范围运算符分配给3D数组的切片

时间:2016-06-04 23:13:47

标签: arrays perl slice

我有一个三维数组。我想设置它的三个元素:

$array[$x][$y][0 .. 2] = (0, 1, 2);

但是perl告诉我:

  

在void上下文中无用的使用常量(1)

在数组上下文中:

@array[$x][$y][0 .. 2] = (0, 1, 2);

但是perl告诉我:

  

语法错误在“] [”

附近

可能意味着它希望我给它两个索引然后分配给第三个维度作为一个单独的数组?但是,在this pageExample: Assignment Using Array Slices下,它表明可以使用范围运算符分配给切片:

@array1[1..3] = @array2[23..25];

如何像这样分配数组的切片,还是必须单独分配每个索引?

2 个答案:

答案 0 :(得分:6)

您需要取消引用内部数组:

@{ $arr[$x][$y] }[ 0 .. 2 ] = (0, 1, 2);

答案 1 :(得分:4)

$array[$x][$y][0..2]不是切片;它只是一个元素查找。

当您尝试将其更改为切片时,您将错误的数组切成薄片。您裁了@arr而不是@{ $arr[$x][$y] }

这里的关键是要意识到在Perl中没有像3d数组这样的东西。你所拥有的是对数组引用数组的引用数组,通常称为数组数组,通常缩写为AoAoA。

数组切片具有以下语法:

  • @NAME[LIST]
  • @BLOCK[LIST]
  • @$REF[LIST]
  • EXPR->@[LIST] [1]

您可以使用以下任何一项:

  • 由于要切片的数组没有名称,因此无法使用第一种语法。
  • @{ $array[$x][$y] }[0..2] = 0..2;
  • my $ref = $array[$x][$y]; @$ref[0..2] = 0..2;
  • $array[$x][$y]->@[0..2] = 0..2; [1]

请参阅http://valadoc.org/#!api=gobject-2.0/GLib.ObjectClass

  1. 需要Perl 5.24+。通过添加use feature qw( postderef );no warnings qw( experimental::postderef );
  2. ,可在Perl 5.20+中使用