我正在尝试在2D阵列中推送/取消移位1D阵列,2D阵列是3D阵列的子阵列。您可以在http://codepad.org/5s8Og64k中查看示例代码以使其更清晰,我也可以在此处复制:
use Data::Dumper;
# @arr_3d ;
$arr_3d[0][0][0] = 1;
$arr_3d[0][1][0] = 2;
$arr_3d[0][0][1] = 4;
$arr_3d[0][1][1] = 3;
# @arr_1d ;
$arr_1d[1] = "new1";
$arr_1d[0] = "new0";
print Dumper(\@arr_3d);
unshift @{$arr_3d[0]},\@arr_1d;
print Dumper(\@arr_3d);
换句话说,如果我们定义3D数组的维度x-y-z并考虑x常数,那么我们得到一个“2D”数组。我想将一维数组推入原始3D数组的2D“子阵列”。
示例代码实际上是这样做的,但是当我尝试将其应用到我的主脚本时,转储器转储“ $ VAR1-> [0] [0] “代替所有先前推入的数据,只转储最后一次推入的1D数据中的数据。
任何想法可能会导致什么或更有效的方式来进行我描述的推动?
额外信息: 实际的数据结构是在循环中创建的,例如:
unshift @{$arr_3d[$index]},\@arr_1d;
print @arr_1d; # This prints successfully the 1D array
创建“@ arr_1d”只需分配单个元素:
$arr_1d[0]='a'; $arr_1d[1]='b'; # etc, etc..
谢谢你的时间, Giorgos
答案 0 :(得分:3)
数组不能包含数组。这就是我们将数组引用放在数组中的原因。
unshift @a, \@arr_1d;
^
|
在“主脚本”中,您将对同一个数组添加两个引用
my @arr_1d;
for (...) {
...
unshift @a, \@arr_1d;
}
这通常通过适当地确定my
变量的范围来解决,因此它会被执行两次,从而创建两个变量。
for (...) {
my @arr_1d;
...
unshift @a, \@arr_1d;
}
另一种方法是在需要时使用[]
创建匿名数组。 ([ ... ]
与do { my @anon = ( ... ); \@anon }
类似。)
my @arr_1d;
for (...) {
...
unshift @a, [ @arr_1d ];
}