2012-12-24 10 views
6

Mam tablicę, @allinfogoals i chcę uczynić z niej tablicę wielowymiarową. Starając się osiągnąć to, próbuję naciskać tablicę jako element tak:Przesyłanie tablicy jako elementu do innej tablicy - nie tworzenie wielowymiarowej tablicy

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

Gdzie te elementy w nawiasach tablicy są wszystkie poszczególne ciągi mam wcześniej. Jednakże, jeśli odwołać $allinfogoals[0], otrzymuję wartość $tempcomponents[0] i jeśli próbuję $allinfogoals[0][0] uzyskać:

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

Jak mogę dodać tych tablic do @allinfogoals aby to wielowymiarowa tablica?

Odpowiedz

15

Przede wszystkim, nawiasy w

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

ogóle nic nie robić. Jest to po prostu dziwny sposób zapisywania wartości domyślnej Parens; nie tworzą listy ani tablic.


Przejdźmy teraz do Twojego pytania. W Perlu nie ma czegoś takiego jak tablica 2d, a tablice mogą zawierać jedynie skalary. Rozwiązaniem jest utworzenie tablicy odwołań do innych tablic. Dlatego

$allinfogoals[0][0] 

jest skrótem

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

jako takie trzeba przechowywać wartości w tablicy i umieścić odniesienie do tej tablicy w tablicy najwyższego poziomu.

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

Ale Perl zapewnia operator, który to upraszcza.

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

Nie dokładnie pewien, dlaczego to działa, ale to nie ...

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

potrzebne do stworzenia iterator, $i, aby to zrobić.


Zgodnie z @ikegami, poniżej podany jest powód.

To działa tylko wtedy, gdy $allinfogoals[$i] nie jest zdefiniowana, gdy jest to dziwny sposób pisania

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

który wykorzystuje autovivification zrobić równowartość

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

który może zostać osiągnięty bez $i korzystania

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

Ten ostatni wycinek zwierzątko jest szczegółowo wyjaśnione w mojej odpowiedzi.

+3

To może wyjaśnić, dlaczego to działa ... http: //perldoc.perl.org/perlreftut.html – squiguy

Powiązane problemy