2012-12-24 14 views
6

Ho un array, @allinfogoals e voglio rendere questo un array multidimensionale. Nel tentativo di ottenere questo risultato, sto cercando di spingere una matrice come un elemento in questo modo:Invio di array come elemento a un altro array - non creazione di array multidimensionali

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

Dove tali elementi in parentesi dell'array sono tutte le singole stringhe che ho in anticipo. Tuttavia, se mi riferisco $allinfogoals[0], ottengo il valore di $tempcomponents[0] e se provo $allinfogoals[0][0] ottengo:

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

Come posso aggiungere questi array di @allinfogoals per renderlo un array multidimensionale?

risposta

15

Prima di tutto, le parentesi in

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

non fare niente. È solo uno strano modo di scrivere

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

Parres cambia precedenza; non creano liste o array.


Ora sulla vostra domanda. Non esiste un array 2d in Perl e gli array possono contenere solo scalari. La soluzione è creare una serie di riferimenti ad altri array. Ecco perché

$allinfogoals[0][0] 

è l'abbreviazione di

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

Come tale, è necessario memorizzare i valori in un array e mettere un riferimento a tale matrice nella matrice di livello superiore.

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

Ma Perl fornisce un operatore che semplifica quello per voi.

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

Non esattamente sicuro perché questo funziona, ma lo fa ...

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

necessaria per creare un iteratore, $i per fare questo.


Secondo @ikegami, ciò che segue è la ragione.

che funziona solo se $allinfogoals[$i] non è definito, quando si tratta di un modo strano di scrivere

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

che utilizza autovivificazione a fare l'equivalente di

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

che può essere raggiunto senza $i utilizzare

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

Questo ultimo snip l'animale domestico è spiegato in dettaglio nella mia risposta.

+3

Questo può spiegare perché funziona ... http: //perldoc.perl.org/perlreftut.html – squiguy

Problemi correlati