• Publicidad

Significado de un código

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

Re: Significado de un código

Notapor explorer » 2010-04-15 14:53 @661

Tienes errores muy graves en tu código...

* lo que devuelven las funciones substr() NO son listas de valores, así que asignar el resultado a variables arreglo es un fallo muy gordo

* y el fallo más gordo: al final, asignas un valor -el resultado de la expansión de todos los arreglos- dentro del arreglo @RegSal. Es decir, este arreglo solo tiene un único valor. En la línea siguiente, le pasas ese valor a un printf(). Y printf intentará meter ese valor dentro del primer campo del formateo: %10s. Y NO mira el resto de la plantilla de formateo.

Debes:
* aprender la diferencia entre una variable escalar y una variable que guarde una lista de valores. El signo que hay delante de una variable ($%@) indica el tipo de dato que obtenemos de la variable

* todas las líneas substr() las puedes dejar en una única función unpack()

* en caso de dudas, pinta los valores que están guardadas en las variables, para saber qué es lo que estás manejando. Puedes usar print("[$variable]\n"); por ejemplo. Y para estructuras más complejas, usar el módulo Data::Dumper.

Ademas, según el printf(), estás sacando todos los campos "pegados" unos a otros. Eso puede ser malo, según quién vaya a leer tu salida.

Con el siguiente programa
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. while (<>) {
  4.     if (/^\s+\d{4}-/) {
  5.         chomp;
  6.         $Fecha    = substr($_,   3, 10);
  7.         $Hora     = substr($_,  14,  8);
  8.         $Esp      = substr($_,  22,  4);
  9.         $Desc     = substr($_,  31, 50);
  10.         $Cta      = substr($_,  82, 11);
  11.         $Contrato = substr($_, 101,  8);
  12.         $Folio    = substr($_, 117, 12);
  13.         $TipInst  = substr($_, 139,  4);
  14.         (@Dinero) = $_ =~ /\$ ?([\d,.]+)/g;
  15.         map { s/,//g; } @Dinero;
  16.         $Ast      = '*';
  17.         printf("%10s%8s%4s%11s%8s%12s%4s%22s%22s%22s%22s%1s\n",
  18.             $Fecha, $Hora, $Esp, $Cta, $Contrato, $Folio, $TipInst, @Dinero, $Ast);
  19.     }
  20. }
  21.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

sale
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
2009-11-2707:48:13.00002-045-2000 CATAL01   5442308  VREP          313782295.29             782295.29                  0.00       999313782295.29*
2009-11-2707:48:13.00002-013-2000 PRUEBA    5442520  VREP            8000959.36          305781335.93                  0.00          305781335.93*
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Lo que te decía: los primeros campos salen pegados, por culpa del formato que has elegido en el printf(). Pero ahora ya ves que cada campo sale con el ancho que tienes definido. Y porque hemos pasado al printf() una serie de valores, no uno solo.

¡Ánimo! Ya verás que Perl es muy versátil y te permite escribir la solución de muchas maneras. Por ejemplo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use diagnostics;
  5.  
  6. while (<>) {
  7.     if (/^\s+\d{4}-/) {
  8.         my @campos = unpack '@3a10 @14a8 @22a4 @82a11 @101a8 @117a12 @139a4';
  9.         my @dinero = map { s/,//g; $_ } ( /\$ ?([\d,.]+)/g );
  10.         printf("%10s %8s%4s %11s %8s %12s %4s %22s%22s%22s%22s*\n", @campos, @dinero);
  11.     }
  12. }
  13.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

En este caso, fíjate que sí pasamos dos variables arreglo a printf(), porque cada de esas variables tienen varios elementos cada una de ellas. Y cada elemento corresponde con cada elemento de la plantilla de printf().

Lo de cómo hemos conseguido leer los valores en @campos y @dinero... es otro tema (a veces hay... demasiada magia...)
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: Significado de un código

Notapor decaro6802 » 2010-04-15 15:42 @696

Gracias por la ayuda, me sirvió de mucho, que estés bien, saludos.
decaro6802
Perlero nuevo
Perlero nuevo
 
Mensajes: 14
Registrado: 2010-04-10 18:45 @823

Anterior

Volver a Básico

¿Quién está conectado?

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

cron