2008-11-25 38 views
18

soy un poco nuevo en Perl, pero aquí es lo que quiero hacer:¿Cómo puedo crear matrices multidimensionales en Perl?

my @array2d; 
while(<FILE>){ 
    push(@array2d[$i], $_); 
} 

No compila desde @array2d[$i] no es una matriz, pero un valor escalar.

¿Cómo debo declarar @ array2d como una matriz de matriz?

Por supuesto, no tengo idea de cuántas filas tengo.

Respuesta

27

Para hacer una matriz de matrices, o más exactamente una serie de arrayrefs, intentar algo como esto:

my @array =(); 
foreach my $i (0 .. 10) { 
    foreach my $j (0 .. 10) { 
    push @{ $array[$i] }, $j; 
    } 
} 

Empuja el valor en un arrayref sin referencia para usted. Usted debe ser capaz de acceder a una entrada como esta:

print $array[3][2]; 
+4

También puede acceder como $ array [3] [2] - no es necesaria la flecha entre índices sucesivos [n] o {clave} de estructuras de datos multinivel. – xdg

+0

Tienes razón, gracias por la información. Voy a actualizar la respuesta para reflejar eso. – gpojd

6

Eche un vistazo a perlref y perldsc para ver cómo hacer estructuras de datos anidados, como matrices de matrices y hashes de hash. Cosas muy útiles cuando estás haciendo Perl.

8

cambiar su línea de "empuje" a esto:

push(@{$array2d[$i]}, $_); 

Básicamente estás haciendo $ array2d [$ i] una matriz por lo rodea por el @ {} ... Entonces puede insertar elementos en esta matriz de referencias de matriz.

+1

Buena explicación. Para aclarar más, $ array2d [$ i] es una referencia de matriz. En @ {$ array2d [$ i]}, el {} bloque devuelve la referencia de matriz y @ sigil la desreferencia como una matriz. Señalo esto para dejar en claro que las llaves son un bloque desnudo, no un dispositivo para subvertir la precedencia. – converter42

+0

Gracias por aclarar mi explicación: sabía que funcionaba, pero nunca supe los motivos técnicos que la respaldaban. ¡Gracias! – BrianH

+0

No, son un bloque de desreferenciación, no un bloque desnudo. En perl -wle '{1 if @ {; last}; print "in"} print "out" ', el último ve el bloque externo, verdaderamente desnudo, no el bloque interno. – ysth

0

Otra forma sencilla es utilizar una tabla de dispersión y el uso de los dos índices de matriz para hacer una clave hash:

$two_dimensional_array{"$i $j"} = $val; 
+0

En realidad, hay azúcar sintáctica antigua para eso: http://perldoc.perl.org/perldata.html # Multi-dimensional-array-emulation - por lo que puedes hacer '$ two_dim_array {$ i, $ j} = $ val' –

3

En realidad no hay diferencia entre lo que escribió y esto:

@{$array2d[$i]} = <FILE>; 

Solo puedo suponer que estás iterando a través de archivos.

Para evitar hacer el seguimiento de un contador, usted puede hacer esto:

... 
push @array2d, [ <FILE> ]; 
... 

Eso dice 1) crear una referencia a un array vacío, 2) el almacenamiento de todas las líneas en el archivo, 3) empujarlo hacia @array2d .

+0

Encuentro esta sintaxis realmente excelente. Buena solución. –

0

Si usted está tratando de almacenar un archivo en una matriz también se puede hacer esto:

fopen(FILE,"<somefile.txt"); 
@array = <FILE>; 
close (FILE); 
Cuestiones relacionadas