• Publicidad

Crear HASH con 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.

Crear HASH con ARRAY Multidimensional

Notapor sarriaga » 2015-08-06 11:49 @534

Hola, ¿qué tal? Muchas gracias, compañeros perleros, por todo el apoyo que he recibido de su parte. Nuevamente ando por acá con algo que no he podido resolver. Les platico la problemática:

Quiero mostrar en el navegador una tabla con cierta información que tengo en un array multidimensional, pero quiero crear un hash a partir de este array para agrupar la información de acuerdo a la posición [2] del array y que esta posición sea la llave o clave del hash y el resto del array sean los valores de esa llave.

Tengo el siguiente (muy poquito) código, donde empiezo a crear los datos que necesito:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my @array = ( ['Muestra de 500 pzas.', '64A10|F/I',  'B/A'], ['Defecto en 10 cajas', '65A10|F/I','C/I'], ['Defecto en 30 pzas', '67A10|B/A', 'B/A'] );
  2.  
  3. my %hash;
  4. my @tit_encontrados;
  5.  
  6. my ($valor, $clave);
  7. my ($x,$y);
  8. foreach $x (0..@array-1){
  9.     foreach $y (0..@{$array[$x]}-1){
  10.         ($clave, $valor) = ($array[2], [$array[0],$array[1]]);
  11.         if (!exists $cols{$clave}) {
  12.             push(@tit_encontrados, $clave);
  13.         }
  14.         push @{$cols{$clave}}, $valor;
  15.         print "$array[$x][$y] \n";
  16.        
  17.     }
  18. }
  19.  
  20. #después hay que pasar los datos a una tabla html
  21.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


La verdad, me siento bastante perdida :?

La tabla que necesito debe quedar de la siguiente manera:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
+--------------+-------------------------------------+
|Identificador |Descripción de reporte               |
+--------------+-------------------------------------+
|              | +---------------------+-----------+ |                    
|              | |Muestra de 500 pzas. | 64A10|F/I | |
|     B/A      | +---------------------+-----------+ |
|              | |Defecto en 30 pzas   | 67A10|B/A | |
|              | +---------------------+-----------+ |
+--------------+-------------------------------------+
|              | +---------------------+-----------+ |                    
|              | |Defecto en 10 cajas  | 65A10|F/I | |
|     C/I      | +---------------------+-----------+ |
|              |                                     |
+--------------+-------------------------------------+
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Ojalá que puedan ayudarme :oops:
¡¡Saludos!!
sarriaga
Perlero nuevo
Perlero nuevo
 
Mensajes: 69
Registrado: 2013-10-21 08:42 @404

Publicidad

Re: Crear HASH con ARRAY Multidimensional

Notapor explorer » 2015-08-06 21:11 @924

Pues... básicamente, ya lo tenías. Solo te quedaba representarlo en HTML.

Esta es una de las muchas maneras de hacerlo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use CGI qw<:standard *table>;                           # importamos rutinas HTML
  3. use feature 'say';                                      # para no tener que usar print
  4. use utf8;                                               # hay algunos caracteres raros en este código
  5. use open OUT => qw':utf8 :std';                         # la salida estándar será en utf8
  6.  
  7.  
  8. my @array =
  9.     ( ['Muestra de 500 pzas.', '64A10|F/I', 'B/A']
  10.     , ['Defecto en 10 cajas',  '65A10|F/I', 'C/I']
  11.     , ['Defecto en 30 pzas',   '67A10|B/A', 'B/A']
  12.     );
  13.  
  14. #+--------------+-------------------------------------+
  15. #|Identificador |Descripción de reporte               |
  16. #+--------------+-------------------------------------+
  17. #|              | +---------------------+-----------+ |                    
  18. #|              | |Muestra de 500 pzas. | 64A10|F/I | |
  19. #|     B/A      | +---------------------+-----------+ |
  20. #|              | |Defecto en 30 pzas   | 67A10|B/A | |
  21. #|              | +---------------------+-----------+ |
  22. #+--------------+-------------------------------------+
  23. #|              | +---------------------+-----------+ |                    
  24. #|              | |Defecto en 10 cajas  | 65A10|F/I | |
  25. #|     C/I      | +---------------------+-----------+ |
  26. #|              |                                     |
  27. #+--------------+-------------------------------------+
  28.  
  29. my %hash;
  30.  
  31. for my $elemento (@array) {                             # pasamos a hash indexado por la $clave
  32.  
  33.     my($concepto, $id, $clave) = @$elemento;
  34.  
  35.     push @{ $hash{$clave} }, [$concepto, $id];
  36. }
  37.  
  38. say start_html(-encoding => 'utf-8');                           # iniciamos una página HTML
  39. say start_table({-border => 3});                                # iniciamos una tabla
  40.  
  41. say Tr(th(['Identificador', 'Descripción de reporte']));       # línea cabecera
  42.  
  43. for my $identificador (sort keys %hash) {                               # para todos los $identificadores
  44.  
  45.     say Tr({-valign => 'center', -align => 'center'},                           # sacamos una línea
  46.             td([                                                                # que contiene
  47.                     $identificador,                                             # el $identificador
  48.                     table({-border => 2, -width => '100%'},                     # y una tabla
  49.                         Tr(                                                     # con una fila
  50.                             [
  51.                                 map { td([@$_]) } @{$hash{$identificador}}      # creamos celdas por cada valor
  52.                             ]
  53.                     )),
  54.             ])
  55.     );
  56. }
  57.  
  58. say end_table();                                                # cerramos la tabla
  59. say end_html();                                                 # cerramos el HTML
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Sale:
Sintáxis: [ Descargar ] [ Ocultar ]
Using html4strict Syntax Highlighting
  1. <!DOCTYPE html
  2.         PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  3.          "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  4. <html xmlns="http://www.w3.org/1999/xhtml" lang="en-US" xml:lang="en-US">
  5. <head>
  6. <title>Untitled Document</title>
  7. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  8. </head>
  9. <body>
  10.  
  11. <table border="3">
  12. <tr><th>Identificador</th> <th>Descripción de reporte</th></tr>
  13. <tr align="center" valign="center"><td>B/A</td> <td><table border="2" width="100%"><tr><td>Muestra de 500 pzas.</td> <td>64A10|F/I</td></tr> <tr><td>Defecto en 30 pzas</td> <td>67A10|B/A</td></tr></table></td></tr>
  14. <tr valign="center" align="center"><td>C/I</td> <td><table border="2" width="100%"><tr><td>Defecto en 10 cajas</td> <td>65A10|F/I</td></tr></table></td></tr>
  15. </table>
  16.  
  17. </body>
  18. </html>
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

En CPAN hay mejores módulos para generar HTML. Incluso hay alguno especializado en sacar tablas, como el caso de HTML::Table, con lo que te podrás ahorrar un montón de líneas (el código quedaría reducido a una sola línea).
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 HASH con ARRAY Multidimensional

Notapor explorer » 2015-08-09 11:00 @500

Bueno, no es una línea más, pero casi ;)
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/env perl
  2. use CGI qw<:standard>;                                  # importamos rutinas HTML
  3. use HTML::Table;
  4. use feature 'say';                                      # para no tener que usar print
  5. use utf8;                                               # hay algunos caracteres raros en este código
  6. use open OUT => qw':utf8 :std';                         # la salida estándar será en utf8
  7.  
  8.  
  9. my @array =
  10.     ( ['Muestra de 500 pzas.', '64A10|F/I', 'B/A']
  11.     , ['Defecto en 10 cajas',  '65A10|F/I', 'C/I']
  12.     , ['Defecto en 30 pzas',   '67A10|B/A', 'B/A']
  13.     );
  14.  
  15. #+--------------+-------------------------------------+
  16. #|Identificador |Descripción de reporte               |
  17. #+--------------+-------------------------------------+
  18. #|              | +---------------------+-----------+ |                    
  19. #|              | |Muestra de 500 pzas. | 64A10|F/I | |
  20. #|     B/A      | +---------------------+-----------+ |
  21. #|              | |Defecto en 30 pzas   | 67A10|B/A | |
  22. #|              | +---------------------+-----------+ |
  23. #+--------------+-------------------------------------+
  24. #|              | +---------------------+-----------+ |                    
  25. #|              | |Defecto en 10 cajas  | 65A10|F/I | |
  26. #|     C/I      | +---------------------+-----------+ |
  27. #|              |                                     |
  28. #+--------------+-------------------------------------+
  29.  
  30. my %hash;
  31.  
  32. for my $elemento (@array) {                             # pasamos a hash indexado por la $clave
  33.  
  34.     my($concepto, $id, $clave) = @$elemento;
  35.  
  36.     push @{ $hash{$clave} }, [$concepto, $id];
  37. }
  38.  
  39. # Última transformación: de hash a array principal
  40. my @array;
  41. for my $k (sort keys %hash) {
  42.     my $table = HTML::Table->new(
  43. #       -align=>'center',
  44.         -border=>2,
  45.         -data=> $hash{$k},
  46.     );
  47.     push @array, [$k, $table->getTable()];
  48. }
  49.  
  50.  
  51. say start_html(-encoding => 'utf-8');                           # iniciamos una página HTML
  52.  
  53. my $table = HTML::Table->new(
  54. #    -rows=>26,
  55. #    -cols=>2,
  56.     -align=>'center',
  57. #    -rules=>'rows',
  58.     -border=>2,
  59. #    -bgcolor=>'blue',
  60. #    -width=>'50%',
  61.     -spacing=>0,
  62.     -padding=>0,
  63. #    -style=>'color: blue',
  64. #    -class=>'myclass',
  65. #    -evenrowclass=>'even',
  66. #    -oddrowclass=>'odd',
  67.     -head=> ['Identificador', 'Descripción de reporte'],
  68.     -data=> \@array,
  69. );
  70.  
  71. $table->print();
  72.  
  73. say end_html();                                                 # cerramos el HTML
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


Volver a Básico

¿Quién está conectado?

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