将数组作为项推送到另一个数组 - 不创建多维数组

时间:2012-12-24 07:22:14

标签: arrays perl

我有一个数组@allinfogoals,我想让它成为一个多维数组。为了实现这一目标,我试图将数组作为一个项目推送出来:

push @allinfogoals, ($tempcomponents[0], $tempcomponents[1], $singlehometeam);

数组括号中的那些项目都是我之前预先拥有的单个字符串。但是,如果我引用$allinfogoals[0],我会得到$tempcomponents[0]的值,如果我尝试$allinfogoals[0][0],我会得到:

Can't use string ("val of $tempcomponents[0]") as an ARRAY ref while "strict refs" in use

如何将这些数组添加到@allinfogoals以使其成为多维数组?

2 个答案:

答案 0 :(得分:15)

首先,

中的parens
push @allinfogoals, ($tempcomponents[0], $tempcomponents[1], $singlehometeam);

什么都不做。这只是一种奇怪的写作方式

push(@allinfogoals, $tempcomponents[0], $tempcomponents[1], $singlehometeam);

Parens改变优先权;他们不创建列表或数组。


现在回答你的问题。在Perl中没有二维数组这样的东西,数组只能容纳标量。解决方案是创建一个对其他数组的引用数组。这就是为什么

$allinfogoals[0][0]

的缩写
$allinfogoals[0]->[0]
   aka
${ $allinfogoals[0] }[0]

因此,您需要将值存储在数组中,并将该数组的引用放在顶层数组中。

my @tmp = ( @tempcomponents[0,1], $singlehometeam );
push @allinfogoals, \@tmp;

但是Perl提供的操作符可以为您简化。

push @allinfogoals, [ @tempcomponents[0,1], $singlehometeam ];

答案 1 :(得分:3)

不完全确定为什么会这样,但它确实......

push (@{$allinfogoals[$i]}, ($tempcomponents[0], $tempcomponents[1], $singlehometeam));

需要创建一个迭代器,$i来执行此操作。


根据@ikegami的说法,原因如下。

只有在未定义$allinfogoals[$i]时才会有效,这是一种奇怪的写作方式

@{$allinfogoals[$i]} = ( $tempcomponents[0], $tempcomponents[1], $singlehometeam );

利用自动生成相当于

$allinfogoals[$i] = [ $tempcomponents[0], $tempcomponents[1], $singlehometeam ];

可以在没有$i使用

的情况下实现
push @allinfogoals, [ $tempcomponents[0], $tempcomponents[1], $singlehometeam ];

在我的回答中详细解释了最后一个片段。