2011-02-17 21 views
9

estoy tratando de crear una matriz 2D en Perl¿Cómo creo una matriz 2D en Perl?

mi código:

my @wordsList=(); 
my @words=(); 

for ($id=0; $id<[email protected]; $id++) 
{ 

     my $eng = $db->selectall_arrayref("select word from words 
                left outer join language 
                on words.languageId = language.languageId 
                where words.languageId = $id 
                ;"); 


     foreach $eng(@$eng) 
     { 
     my($word) = @$eng; 
     $ref_to_Array->[$id][$word] = @words($id,$word); 

      } 
       return $words($id, $word); 
} 

$wordsList= NextWords(); 
print $wordsList; 

vuelve no .. porque quiero devolver la matriz 2d.

actualización

Todavía estoy confundido porque cuando yo haga la consulta, me da una lista de palabras como:

select word from words where language_id = 1 
(1=english, 2 - chinese, 3 - french) 

estoy usando el bucle a través del lenguaje y con el fin para obtener todas las palabras de la base de datos

El problema es que quiero hacer un bucle y quiero que la matriz se agregue automáticamente a la matriz 2d.

Respuesta

25

Coloque use warnings; use strict; en la parte superior de cada programa que escriba. Esos dos pragmas atraparán muchos errores para ti.

No puede acceder a una matriz con un postfix (...). Esa construcción se usa para llamar a las funciones mysub(...) o $mysubref->(...). Para acceder a los elementos de la matriz, use un postfijo [ index ]. Y en Perl, las matrices multidimensionales requieren un par de [...] para cada nivel. Esto se debe a que una matriz 2D es simplemente una matriz donde cada elemento también es una matriz.

my @array = ([1, 2, 3], [4, 5, 6], [7, 8, 9]); 

my $top_left  = $array[0][0]; # 1 
my $bottom_right = $array[2][2]; # 9 

print "@$_\n" for @array; 
 
1 2 3 
4 5 6 
7 8 9 

Usted puede aprender más acerca de las estructuras de datos de Perl y el resto de Perl en perldoc.perl.org. Aquí hay algunos enlaces directos:

Por último, @language.length no hace lo que usted cree. Está tomando @language en contexto escalar, que es su longitud como un número y luego concatenándolo con length($_). La expresión resultante es algo así como (scalar @language) . length($_). Como el operador <= impone contexto escalar en sus argumentos, simplemente puede escribir $id <= @language. Sin embargo, Perl que proporciona una forma más natural de escribir este tipo de bucle:

for my $id (0 .. @language) {...} 

o

 
for my $id (0 .. $#language) {...} 
si realmente se quiere decir $id < @language desde $language[scalar @language] es uno de los elementos más allá del final de la matriz.

+1

Entiendo el concepto en la matriz 2d .. – JoT