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 @args = @ARGV; if ($#args != 3) { die "ERROR: Cantidad de parametros invalida.\n"; } if (!($success = open IN, "<$args[0]")) { die "ERROR: Archivo de entrada inexistente o sin permisos de lectura.\n"; } if ($args[1] == $args[2]) { die "ERROR: Ubicacion del campo cliente es igual a la del campo monto.\n"; } chomp($linea = <IN>); @reg = split /;/, $linea; close IN; $cantampos = $#reg + 1; if (($args[1] < 1) || ($args[1] > $cantampos)) { die "ERROR: Ubicaciones del campo cliente invalida.\n"; } if (($args[2] < 1) || ($args[2] > $cantampos)) { die "ERROR: Ubicaciones del campo monto invalida.\n"; } if (-e $args[3]) { print "El archivo de salida ya existe. Desea reemplazarlo?\n"; $resp = <STDIN>; if ($resp =~ /^si$/i) { open OUT, ">$args[3]"; } elsif ($resp =~ /^no$/i) { die "ERROR: El archivos de salida ya existe.\n"; } else { die "ERROR: Respuesta incorrecta, ingresar \"SI\" o \"NO\"\n"; } } else { open OUT, ">$args[3]"; } open IN, "<$args[0]"; $ccliente = $args[1] - 1; $cmonto = $args[2] - 1; while (defined($linea = <IN>)) { @reg = split /;/, $linea; $cliente = $reg[$ccliente]; $monto = $reg[$cmonto]; if (exists $hash{$cliente}) { $hash{$cliente} = $hash{$cliente} + ($monto); } else{ $hash{$cliente} = $monto; } } close IN; while ( ($key, $value) = each %hash) { print OUT "$key,$value\n"; } close OUT;