我有一个数组@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
以使其成为多维数组?
答案 0 :(得分:15)
首先,
中的parenspush @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 ];
在我的回答中详细解释了最后一个片段。