6

配列があり、@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して多次元配列にする方法を教えてください。

4

2 に答える 2

16

まず、中のかっこ

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

何もしないでください。なんか変な書き方だな

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

括弧は優先順位を変更します。リストや配列は作成しません。


それでは、あなたの質問に進みましょう。Perl には 2 次元配列のようなものはなく、配列はスカラーしか保持できません。解決策は、他の配列への参照の配列を作成することです。それが理由です

$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 ];
于 2012-12-24T08:02:39.963 に答える
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 ];

この最後のスニペットは、私の回答で詳しく説明されています。

于 2012-12-24T07:29:04.887 に答える