【问题标题】:Perl: Pushing a 1d array into a 3d sub-arrayPerl:将 1d 数组推入 3d 子数组
【发布时间】:2013-09-10 15:12:25
【问题描述】:

我正在尝试在 2D 数组中推送/取消移位 1D 数组,该数组是 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]”代替所有之前推入的数据,并且只转储上一个推入的一维数组中的数据。

知道是什么原因造成的,或者有什么更有效的方法来完成我描述的推动?

额外信息: 实际的数据结构是在循环中创建的,类似于:

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..

感谢您的宝贵时间, 乔戈斯

【问题讨论】:

  • 那么,您是如何构建您的实际数据结构的?它有一些循环吗?
  • 我在文章末尾添加了实际数据结构创建的信息。感谢您的关注。

标签: perl multidimensional-array push arrays


【解决方案1】:

数组不能包含数组。这就是为什么我们将数组的引用放在数组中。

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

【讨论】:

  • 感谢您解决了我的问题并教会了我一些新知识。你真是太好了!
猜你喜欢
  • 2013-01-08
  • 1970-01-01
  • 2022-08-03
  • 2020-04-22
  • 2012-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-16
相关资源
最近更新 更多