2012-12-24 11 views
6

Ich habe ein Array, @allinfogoals, und ich möchte dies zu einem mehrdimensionalen Array machen. Im Versuch, dies zu tun, ich versuche, ein Array als ein Element zu drücken, wie so:Array als Element zu einem anderen Array schieben - kein multidimensionales Array erstellen

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

Sind diese Elemente im Array Klammer sind alle einzelnen Strings ich vorher haben. Allerdings, wenn ich $allinfogoals[0] Referenz, bekomme ich den Wert von $tempcomponents[0] und wenn ich $allinfogoals[0][0] versuche ich bekommen:

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

Wie kann ich diese Arrays @allinfogoals fügen Sie es ein mehrdimensionales Array zu machen?

Antwort

15

Vor allem die Pars in

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

tun gar nichts. Es ist nur eine seltsame Art zu schreiben

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

Parens Änderung Vorrang; Sie erstellen keine Liste oder Arrays.


Nun zu Ihrer Frage. Es gibt kein 2d-Array in Perl, und Arrays können nur Skalare enthalten. Die Lösung besteht darin, ein Array von Referenzen zu anderen Arrays zu erstellen. Deshalb

$allinfogoals[0][0] 

für

$allinfogoals[0]->[0] 
    aka 
${ $allinfogoals[0] }[0] 

Als solche kurz ist, müssen Sie Ihre Werte in einem Array speichern und eine Referenz auf dieses Array in dem Top-Level-Array setzen.

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

Aber Perl bietet einen Operator, der das für Sie vereinfacht.

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

nicht ganz sicher, warum das funktioniert, aber es funktioniert ...

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

benötigt einen Iterator zu erstellen, $i dies zu tun.


Laut @ikegami, was folgt, ist der Grund.

, dass nur wenn $allinfogoals[$i] funktioniert, ist nicht definiert, wenn es sich um eine seltsame Art und Weise des Schreibens ist

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

die autovivification das Äquivalent von

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

zu tun verwendet, die ohne $i erreicht werden kann unter Verwendung von

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

Dieser letzte Ausschnitt Haustier wird in meiner Antwort ausführlich erklärt.

+3

Dies kann erklären, warum das funktioniert ... http: //perldoc.perl.org/perlreftut.html – squiguy