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

Mar*_*ons 6 arrays perl

我有一个数组,@allinfogoals我想让它成为一个多维数组.为了实现这一点,我试图将数组作为项目推送如下:

push @allinfogoals, ($tempcomponents[0], $tempcomponents[1], $singlehometeam);
Run Code Online (Sandbox Code Playgroud)

数组括号中的那些项目都是我预先拥有的单个字符串.但是,如果我参考$allinfogoals[0],我得到的价值,$tempcomponents[0]如果我尝试$allinfogoals[0][0]我得到:

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

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

ike*_*ami 16

首先,parens in

push @allinfogoals, ($tempcomponents[0], $tempcomponents[1], $singlehometeam);
Run Code Online (Sandbox Code Playgroud)

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

push(@allinfogoals, $tempcomponents[0], $tempcomponents[1], $singlehometeam);
Run Code Online (Sandbox Code Playgroud)

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


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

$allinfogoals[0][0]
Run Code Online (Sandbox Code Playgroud)

是的缩写

$allinfogoals[0]->[0]
   aka
${ $allinfogoals[0] }[0]
Run Code Online (Sandbox Code Playgroud)

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

my @tmp = ( @tempcomponents[0,1], $singlehometeam );
push @allinfogoals, \@tmp;
Run Code Online (Sandbox Code Playgroud)

但Perl提供的操作员可以为您简化.

push @allinfogoals, [ @tempcomponents[0,1], $singlehometeam ];
Run Code Online (Sandbox Code Playgroud)