Cátedra: Osvaldo Clua
Fecha: Primera Oportunidad - Primer Cuatrimestre 2005
Día: 24/05/2005
Tema: PERL
Desarrollar un comando PERL denominado “saca_saldo.pl” que obtiene el saldo final en cuenta corriente (positivo o negativo) de los clientes luego de procesar facturas y pagos. Los registros de facturas tienen su monto sin signo, los registros de pagos tienen su monto con signo negativo. Para invocar este comando, el usuario especificará los siguientes parámetros.
El comando debe procesar el archivo de ENTRADA cuyo nombre es pasado como parámetro y dejar el resultado en el archivo de SALIDA cuyo nombre tambien es pasado como parámetro.
El separador de campos del archivo de ENTRADA es la coma.
El separador de campos del archivo de SALIDA debe ser el punto y coma, y su formato : cliente;saldo
Ademas se pasan como parámetro: ubicación del campo cliente y ubicación del campo monto dentro del archivo de entrada.
Es obligatorio el uso de una estructura de hash para efectuar la suma de los montros por cliente. El campo cliente es el que se debe emplear como clave y el campo monto es el que se debe acumular.
Salida: Se debe grabar en un archivo de salida con todos los clientes y su correspondiente saldo.
Validaciones a efectuar:
Archivo input (usando las 2da y 4ta columna):
#!/usr/bin/perl -w ################################################################################################################ # Autor: Maximiliano Milicich (maximiliano.milicich@gmail.com) ################################################################################################################ # Deben ser 4 argumentos: $cant_param = @ARGV; if ($cant_param != 4) { print "Error - Debe informar 4 parametros: pos_campo_MONTO pos_campo_CLIENTE arch_IN arch_OUT".$/; exit 1; } $pos_campo_monto = $ARGV[0]; $pos_campo_cliente = $ARGV[1]; $arch_in = $ARGV[2]; $arch_out = $ARGV[3]; # Validaciones de argumentos: if ($pos_campo_monto < 1 || $pos_campo_cliente < 1) { print "Los argumentos de posicion de campo deben ser iguales o mayores a 1.".$/; exit 1; } if ($pos_campo_monto == $pos_campo_cliente) { print "Los argumentos de posicion de campo MONTO - CLIENTE no pueden ser iguales".$/; exit 1; } # Existe el archivo de salida ? lo sobreescribimos ? while (open(TEST_EXISTS, "< $arch_out")) { close(TEST_EXISTS); print "El archivo $arch_out ya existe. Desea sobreescribirlo? : "; $rta = <STDIN>; chomp($rta); if ($rta =~ /^\s*SI\s*$/i) { last; } elsif ($rta =~ /^\s*NO\s*$/i) { print "Proceso cancelado.".$/; exit 1; } else { next; } } # Este es el hash para almacenar el saldo x cliente: %saldo_x_cliente = (); # Procesamos el archivo de entrada, linea a linea: open(ARCH_IN, "< $arch_in") || die "No se pudo abrir el archivo de entrada $arch_in"; while ($linea = <ARCH_IN>) { chomp($linea); @campos = split(/,/, $linea); $cant_campos = @campos; # si no hay campos en este registro (un renglon en blanco) seguimos con el proximo registro: if ($cant_campos == 0) { next; } # Aca validamos q las posiciones recibidas como argumento sean validas en el registro: if ($pos_campo_cliente > $cant_campos || $pos_campo_monto > $cant_campos) { close(ARCH_IN); $pos_err = $pos_campo_cliente; $pos_err = $pos_campo_monto if $pos_campo_monto > $pos_campo_cliente; print "Error - La posicion de campo $pos_err es mayor a la cantidad de campos del registro : $cant_campos".$/; exit 1 } # La magia de los Hash de PERL =) : $saldo_x_cliente{$campos[$pos_campo_cliente - 1]} += $campos[$pos_campo_monto - 1]; } close(ARCH_IN); # Grabamos en archivo de salida el resultado (saldo x cliente): open(ARCH_OUT, "> $arch_out") || die "No se pudo abrir el archivo de salida $arch_out"; while (($cliente, $saldo) = each(%saldo_x_cliente)) { print ARCH_OUT "$cliente;$saldo".$/; } close(ARCH_OUT); # Mostramos el resultado por pantalla: system("cat $arch_out");