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
Using perl Syntax Highlighting
#!/usr/bin/perl
while (<>) {
if (/^\s+\d{4}-/) {
chomp;
$Fecha = substr($_, 3, 10);
$Hora = substr($_, 14, 8);
$Esp = substr($_, 22, 4);
$Desc = substr($_, 31, 50);
$Cta = substr($_, 82, 11);
$Contrato = substr($_, 101, 8);
$Folio = substr($_, 117, 12);
$TipInst = substr($_, 139, 4);
(@Dinero) = $_ =~ /\$ ?([\d,.]+)/g;
map { s/,//g; } @Dinero;
$Ast = '*';
printf("%10s%8s%4s%11s%8s%12s%4s%22s%22s%22s%22s%1s\n",
$Fecha, $Hora, $Esp, $Cta, $Contrato, $Folio, $TipInst, @Dinero, $Ast);
}
}
Coloreado en 0.003 segundos, usando
GeSHi 1.0.8.4
sale
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:
Using perl Syntax Highlighting
#!/usr/bin/perl
use strict;
use warnings;
use diagnostics;
while (<>) {
if (/^\s+\d{4}-/) {
my @campos = unpack '@3a10 @14a8 @22a4 @82a11 @101a8 @117a12 @139a4';
my @dinero = map { s/,//g; $_ } ( /\$ ?([\d,.]+)/g );
printf("%10s %8s%4s %11s %8s %12s %4s %22s%22s%22s%22s*\n", @campos, @dinero);
}
}
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...)