• Publicidad

Dibujar con GD::Simple array multidimensional

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

Re: Dibujar con GD::Simple array multidimensional

Notapor explorer » 2015-03-24 16:16 @719

Pues... yo no veo problemas... Para el array mostrado en la línea 1, genera una matriz de 3x2:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
[65,122] 66A10
[165,122] 64A10
[265,122] 54B01
[65,142] 67A10
[165,142] 65A10
[265,142]
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
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

Publicidad

Re: Dibujar con GD::Simple array multidimensional

Notapor sarriaga » 2015-03-24 16:33 @731

Me regresa la siguiente matriz

[65,122] 66A10
[165,122] 64A10
[165,142] 65A10
[265,122] 54B01

por lo que me falta
[65,142] 67A10
sarriaga
Perlero nuevo
Perlero nuevo
 
Mensajes: 69
Registrado: 2013-10-21 08:42 @404

Re: Dibujar con GD::Simple array multidimensional

Notapor explorer » 2015-03-24 16:49 @742

¡Pues vaya! Sí que es raro... Yo he ejecutado tu código, tal cual, poniendo un print en el bucle más interno.

He colocado print Dumper en cada fase del código, y sí que sale bien.

Esta es mi versión (sin usar GD::Simple):
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use v5.14;
  3. use Data::Dumper;
  4. use autodie;
  5.  
  6.  
  7. my @array = ( '64A10|F/I', '65A10|F/I', '66A10|B/A', '67A10|B/A', '54B01|C/I' );
  8. my %cols;
  9.  
  10. for (@array) {
  11.     my($valor, $clave) = split /\|/;
  12.  
  13.     push @{$cols{$clave}}, $valor;
  14. }
  15.  
  16. say Dumper \%cols;
  17.  
  18.  
  19. my $iX =  65;
  20. my $iY = 122;
  21. my $dX = 100;
  22. my $dY =  20;
  23.  
  24. my $X  = $iX;
  25. my $Y  = $iY;
  26.  
  27. for my $col (sort keys %cols) {                 # Titulares ordenados
  28.  
  29.     $Y = $iY;                                   # Reiniciar Y
  30.  
  31.     for my $valor ($col, @{$cols{$col}}) {      # para el titular y sus datos
  32.         say "[$X,$Y] $valor";                   # los pintamos
  33.         $Y += $dY;                              # en la misma columna, por filas
  34.     }
  35.  
  36.     $X += $dX;                                  # siguiente columna
  37. }
  38.  
  39. __END__
  40.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
La salida es:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
$VAR1 = {
          'B/A' => [
                     '66A10',
                     '67A10'
                   ],
          'C/I' => [
                     '54B01'
                   ],
          'F/I' => [
                     '64A10',
                     '65A10'
                   ]
        };

[65,122] B/A
[65,142] 66A10
[65,162] 67A10
[165,122] C/I
[165,142] 54B01
[265,122] F/I
[265,142] 64A10
[265,162] 65A10
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
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: Dibujar con GD::Simple array multidimensional

Notapor sarriaga » 2015-04-22 14:05 @629

Pues ya lo dibuja correctamente.

Sólo tengo una duda: ¿cómo puedo hacer para que el array final tenga el mismo orden que el original? Puesto que cuando se crea el hash para quitar los duplicados lo desordena. ¿Hay manera de ordenarlo de acuerdo al array original?
sarriaga
Perlero nuevo
Perlero nuevo
 
Mensajes: 69
Registrado: 2013-10-21 08:42 @404

Re: Dibujar con GD::Simple array multidimensional

Notapor explorer » 2015-04-22 18:52 @828

Es que el array original no contiene los titulares... son extraídos de los propios datos que vamos leyendo del @array.

Se puede hacer una cosa... vamos leyendo los datos del @array, y cada vez que encontramos un titular nuevo, lo guardamos en otro array. De esa manera vamos guardando el orden de aparición de los titulares, que aprovecharemos en la salida.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/env perl
  2. use v5.14;
  3.  
  4. my @array = ( '64A10|F/I', '65A10|F/I', '66A10|B/A', '67A10|B/A', '54B01|C/I' );
  5. my %cols;
  6. my @titulares_encontrados;
  7.  
  8.  
  9. for (@array) {
  10.     my($valor, $clave) = split /\|/;
  11.  
  12.     if (!exists $cols{$clave}) {        # si encontramos un titular nuevo
  13.         push @titulares_encontrados, $clave;            # lo guardamos
  14.     }
  15.  
  16.     push @{$cols{$clave}}, $valor;
  17. }
  18.  
  19. say Dumper \%cols;
  20.  
  21.  
  22. my $iX =  65;
  23. my $iY = 122;
  24. my $dX = 100;
  25. my $dY =  20;
  26.  
  27. my $X  = $iX;
  28. my $Y  = $iY;
  29.  
  30. for my $col (@titulares_encontrados) {
  31.  
  32.     $Y = $iY;                           # Reiniciar Y
  33.  
  34.     for my $valor ($col, @{$cols{$col}}) {
  35.         say "[$X,$Y] $valor";
  36.         $Y += $dY;
  37.     }
  38.  
  39.     $X += $dX;
  40. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
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: Dibujar con GD::Simple array multidimensional

Notapor sarriaga » 2015-04-23 08:26 @393

Sí, lo ordena de la manera que va a apareciendo en el primer array. Una última duda: ¿Cómo puedo guardar cuántas veces se repitió el titular en ese mismo orden? Lo estaba haciendo por separado pero lo desordena.
Última edición por explorer el 2015-04-23 12:37 @567, editado 1 vez en total
Razón: como => Cómo; cuantas => cuántas;
sarriaga
Perlero nuevo
Perlero nuevo
 
Mensajes: 69
Registrado: 2013-10-21 08:42 @404

Re: Dibujar con GD::Simple array multidimensional

Notapor explorer » 2015-04-23 12:41 @570

En el código, en la línea 34, ves que aparece @{$cols{$col}}, que es un array que almacena los valores asociados al titular $col.

Entonces, si quieres saber cuántos son, solo tienes que ver cuántos elementos hay en ese array:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.     my $numero_elementos = @{$cols{$col}};
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
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

Anterior

Volver a Básico

¿Quién está conectado?

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