我有一个三维数组。我想设置它的三个元素:
$array[$x][$y][0 .. 2] = (0, 1, 2);
但是perl告诉我:
在void上下文中无用的使用常量(1)
在数组上下文中:
@array[$x][$y][0 .. 2] = (0, 1, 2);
但是perl告诉我:
语法错误在“] [”
附近
可能意味着它希望我给它两个索引然后分配给第三个维度作为一个单独的数组?但是,在this page下Example: Assignment Using Array Slices
下,它表明可以使用范围运算符分配给切片:
@array1[1..3] = @array2[23..25];
如何像这样分配数组的切片,还是必须单独分配每个索引?
答案 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。
use feature qw( postderef );
和no warnings qw( experimental::postderef );
。