• Publicidad

Crear arreglos desde los datos de otro arreglo

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Crear arreglos desde los datos de otro arreglo

Notapor elistraus » 2012-04-12 16:34 @731

Saludos a la comunidad, me he calentado bastante ya en este ejercicio.

Tengo un array recibido desde una base de datos de esta manera:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
luis|22|musica|70
luis|22|musica|80
luis|22|musica|90
raul|30|videos|accion
raul|30|videos|terror
juan|27|juegos|COD
juan|27|juegos|MOD
...
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

y ésta puede tener más datos similares.

El asunto es que quiero generar un array por cada tercer elemento que sea igual. Por ejemplo, un array para los de música, videos, juegos, etc. y no lo he podido lograr.

Esto he hecho hasta el momento:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.         while (my @row = $sql->fetchrow_array()){
  2.                 $resultado[$i]= $row[0].'|'.$row[1].'|'.$row[2].'|'.$row[3].'|'.$row[4].'|'.$row[5]."\n";
  3.                 $i++
  4.         }
  5.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

Así obtengo los datos y después...
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.         @resultado2 = @resultado;
  2.         for ($i=0;$i<scalar(@resultado2);$i++){
  3.                 my @r_1 = split(m/\|/i,$resultado2[$i]);
  4.                 $x = $r_1[3];
  5.                 for ($i=0;$i<scalar(@resultado2);$i++){
  6.                         my @r_1 = split(m/\|/i,$resultado2[$i]);
  7.                         $y = $r_1[3];
  8.                         if ($y eq $x){
  9.                              #aquí quiero generar los array  
  10.                         }
  11.                 }
  12.                 shift(@resultado2); # le saca los elementos para hacer la siguiente iteración
  13.                 print scalar(@resultado2)."\n";
  14.         }
  15.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


He leído bastante, pero la verdad, al ser nuevo en Perl, me confundo...

A ver si alguien me puede orientar
¡¡¡Saludos!!!
Última edición por explorer el 2012-04-12 16:49 @742, editado 1 vez en total
Razón: Cambiadas las marcas de PHP a Perl
elistraus
Perlero nuevo
Perlero nuevo
 
Mensajes: 37
Registrado: 2011-10-31 23:37 @026

Publicidad

Re: Crear arreglos desde los datos de otro arreglo

Notapor explorer » 2012-04-12 17:16 @761

Es un poco lioso guardar los elementos con separadores, para luego separarlos ;)

Mejor así (no probado):
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.         while (my @row = $sql->fetchrow_array()){
  2.             push @resultado, \@row;              # guardamos un elemento más en @resultado, que es una referencia
  3.                                                  # a un array con los valores de la fila
  4.         }                                        # @resultado es un array de array
  5.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Y para crear la estructura que pides, es mejor usar un hash:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/env perl
  2. my @resultado = (                                # Imitamos la estructura devuelta antes
  3.     [ qw<luis 22 musica 70>     ],
  4.     [ qw<luis 22 musica 80>     ],
  5.     [ qw<luis 22 musica 90>     ],
  6.     [ qw<raul 30 videos accion> ],
  7.     [ qw<raul 30 videos terror> ],
  8.     [ qw<juan 27 juegos COD>    ],
  9.     [ qw<juan 27 juegos MOD>    ],
  10. );
  11.  
  12. my %hash;                        # las claves del hash serán las terceras columnas de @resultado
  13.  
  14. for my $fila (@resultado) {      # para cada $fila de @resultado
  15.     my @row = @{$fila};          # sacamos todos los elementos de la $fila
  16.  
  17.     push @{ $hash{ $row[2] } }, [ @row[0,1,3] ];    # Según el valor de la tercera columna,
  18.                                                     # guardamos la primera, segunda y cuarta, como un array,
  19.                                                     # como un elemento más del array referenciado por %hash
  20. }
  21.  
  22. use Data::Dumper::Perltidy;
  23. print Dumper %hash;                                 # Vamos a ver qué aspecto tiene la estructura de datos
  24.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

El resultado será:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
$VAR1 = {
    'videos' => [ [ 'raul', '30', 'accion' ], [ 'raul', '30', 'terror' ] ],
    'musica' => [ [ 'luis', '22', '70' ],     [ 'luis', '22', '80' ], [ 'luis', '22', '90' ] ],
    'juegos' => [ [ 'juan', '27', 'COD' ],    [ 'juan', '27', 'MOD' ] ]
};
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Y ahora ya puedes acceder a toda la información. Por ejemplo, para ver los juegos de Juan:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. for my $juegos ( @{ $hash{juegos} } ) {
  2.     if($juegos->[0] eq 'juan') {
  3.         print "Juan juega a ", $juegos->[2], "\n";
  4.     }
  5. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
sale:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Juan juega a COD
Juan juega a MOD
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Más información en tu propio ordenador en perldoc perlref, y en la Web (traducido).
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Crear arreglos desde los datos de otro arreglo

Notapor elistraus » 2012-04-13 09:25 @434

Gracias por responder explorer, pero sigo sin conseguirlo, he intentado hacer lo que me recomendaste pero al hacer:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. while ( my @row = $sql->fetchrow_array() ) {
  2.     push @resultado, \@row;            # guardamos un elemento más en @resultado, que es una referencia
  3.                                        # a un array con los valores de la fila
  4. }                                      # @resultado es un array de array
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


y hacer un print @resultado me salen resultados así
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
ARRAY(0xd54e2d0)ARRAY(0xd69d930)ARRAY(0xd69d9b0)ARRAY(0xd69da30)ARRAY(0xd69dab0)ARRAY(0xd69db30)ARRAY(0xd69dbb0)ARRAY(0xd69dc30)ARRAY(0xd69dcb0)
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


y no me muestra los valores, sola las referencias y no sé cómo visualizarlas...

En la parte
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my @resultado = (                                # Imitamos la estructura devuelta antes
  2.     [ qw<luis 22 musica 70>     ],
  3.     [ qw<luis 22 musica 80>     ],
  4.     [ qw<luis 22 musica 90>     ],
  5.     [ qw<raul 30 videos accion> ],
  6.     [ qw<raul 30 videos terror> ],
  7.     [ qw<juan 27 juegos COD>    ],
  8.     [ qw<juan 27 juegos MOD>    ],
  9. );
  10.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


me gustaría saber cómo hacerlo dinámico, no seteado, que el resultado de la consulta vaya ahí y como no logro hacer esto no he podido probar lo otro. A ver si me puedes decir qué hago mal que estoy seguro que es algo que no estoy entendiendo que me sale mal...

Otra cosa: Mi compilación de Perl no tiene el módulo Data::Dumper::Perltidy, para mostrar un resultado hash de esa manera...


Saludos
elistraus
Perlero nuevo
Perlero nuevo
 
Mensajes: 37
Registrado: 2011-10-31 23:37 @026

Re: Crear arreglos desde los datos de otro arreglo

Notapor explorer » 2012-04-13 12:31 @563

elistraus escribiste:y hacer un print @resultado me salen resultados así
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
ARRAY(0xd54e2d0)ARRAY(0xd69d930)ARRAY(0xd69d9b0)ARRAY(0xd69da30)ARRAY(0xd69dab0)ARRAY(0xd69db30)ARRAY(0xd69dbb0)ARRAY(0xd69dc30)ARRAY(0xd69dcb0)
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
Claro, estamos hablando de un array que contiene en cada elemento una referencia a otro array. Al hacer el print() de un array, Perl solo te despliega los elementos de ese array. Perl no sabe nada de desplegar estructuras más complicadas.

Tienes que hacerlo así (una de las varias formas que se comentan en perldsc):
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. for my $linea (@resultado) {                     # Para cada fila de @resultado
  2.     for my $item (@$linea) {                     # Para cada elemento de la @$línea
  3.         print "$item ";
  4.     }
  5.     print "\n";
  6. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


elistraus escribiste:Me gustaría saber cómo hacerlo dinámico, no seteado, que el resultado de la consulta vaya ahí y como no logro hacer esto no he podido probar lo otro. A ver si me puedes decir qué hago mal que estoy seguro que es algo que no estoy entendiendo que me sale mal...
La estructura que yo he puesto fija es exactamente la misma estructura que hemos creado antes en @resultado (un array de arrays), así que en el programa final, el resultado de la consulta sustituye a esta parte que he puesto yo (porque yo no tengo tu base de datos, he tenido que ponerla "a mano" dentro del programa).

elistraus escribiste:Otra cosa: Mi compilación de Perl no tiene el módulo Data::Dumper::Perltidy, para mostrar un resultado hash de esa manera...
Pues... o lo instalas o editas el programa y cambias esa líneas para que ponga Data::Dumper, que sí estará instalado.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Crear arreglos desde los datos de otro arreglo

Notapor elistraus » 2012-04-13 12:56 @580

Muchas gracias, seguiré tus consejos al pie de la letra ¡je,je,je,je,je! Lo tengo que conseguir cueste lo que cueste, y ya ando mirando a comprarme un libro...

Te comento cómo voy, entonces...

Saludos
elistraus
Perlero nuevo
Perlero nuevo
 
Mensajes: 37
Registrado: 2011-10-31 23:37 @026

Re: Crear arreglos desde los datos de otro arreglo

Notapor elistraus » 2012-04-13 15:10 @673

Ya conseguí que me funcionara el módulo. Tenías razón: Solo lo deje en Data::Dumper y funcionó. Solo me queda el detalle del hash, que no me resulta. No es que quiera abusar, pero de verdad que estoy intrigado, a ver si decirme en qué me equivoco, por favor...

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.         while (my @row = $sql->fetchrow_array()){
  2.                 push @resultado, \@row;
  3.         }
  4.         my %hash;
  5.         for my $linea (@resultado){
  6.                 for my $item(@$linea){
  7.                         print "$item ";    # aquí imprimimos los ítem
  8.                 }  
  9.                 print "\n";                # aquí le hago un salto para ver las filas
  10.                 push @{ $hash{ $item[5] } }, [ @$linea[0,1,2,3,4,6] ];
  11.                   # y aquí es donde quiero hacer lo que me dijiste anteriormente
  12.                   # pero me da el error:
  13.                   # Global symbol "@item" requires explicit package name
  14.         }
  15.         print Dumper %hash;
  16.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Y no me imprime el hash :(

Saludos
elistraus
Perlero nuevo
Perlero nuevo
 
Mensajes: 37
Registrado: 2011-10-31 23:37 @026

Re: Crear arreglos desde los datos de otro arreglo

Notapor explorer » 2012-04-13 19:09 @840

El error dice que en la línea 10 estás queriendo usar $item[5], es decir, el sexto elemento de @item. Y claro: Perl se da cuenta de que @item no está declarada ni definida en ningún sitio...

Cambia la línea 10 por:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.                 push @{ $hash{ $linea->[5] } }, [ @{$linea}[0..4,6] ];
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Es decir: $linea es una referencia a un array.

Así que con $linea->[5] accedemos al sexto elemento de ese array.

Y la otra notación quiere decir: $linea es una referencia a un array. Con @{$linea} la desreferenciamos -obtenemos todos los elementos del array-. Y como cualquier otro array, podemos usar índices para extraer valores (unos cuantos).

No es necesario comprarse un manual... Tu propio Perl, en tu propio ordenador, ya trae una serie de documentos para entender el funcionamiento de las estructuras de datos complejas (que, a propósito, esto no es propio de Perl, sino que es común en muchos lenguajes de ordenador).

Con el comando perldoc puedes sacar esas páginas. Tienes a perldata, perldsc, perllol, y perlref. Las tienes también en versión web en perldoc.org. Y algunas de ellas, ya traducidas.

Solo es tener voluntad de aprender...

P.D. No se dice 'haber', sino 'a ver' :wink:
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Crear arreglos desde los datos de otro arreglo

Notapor elistraus » 2012-04-17 13:18 @596

Muy buena explicación, explorer. Te pasaste, de verdad, y me sirvió muchísimo el código, además aprendí muchas cosas nuevas de Perl y todavía voy a aprender más, ¡je,je,je,je,je...! Esa es la idea. No sé si sirva a alguien, pero colocaré el código:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.         my $entrada = "";
  2.         my @resultado;
  3.         while (my @row = $sql->fetchrow_array()){
  4.                 push @resultado, \@row;
  5.         }
  6.         my %hash;
  7.         my @wey;
  8.         for my $linea (@resultado) {
  9.                 for my $item (@$linea) {
  10.                         push @wey,$item;
  11.                 }
  12.                 push @{ $hash{ $linea->[9] } }, [ @{$linea}[0..8] ];
  13.         }
  14.         print Dumper %hash;
  15.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Ahora seguiré aprendiendo...

Saludos
elistraus
Perlero nuevo
Perlero nuevo
 
Mensajes: 37
Registrado: 2011-10-31 23:37 @026


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 16 invitados