====== Examen Parcial - 75.08. Sistemas Operativos ====== **Cátedra:** Osvaldo Clua\\ **Fecha:** Primera Oportunidad - Primer Cuatrimestre 2005\\ **Día:** 24/05/2005\\ **Tema:** PERL Esta página está incompleta; podés ayudar completando el material. ===== Enunciado ===== 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. - Parámetro 3: Nombre del archivo de ENTRADA - Parámetro 2: Ubicación del campo cliente - Parámetro 1: Ubicación del campo monto - Parámetro 4: Nombre del archivo de SALIDA 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:__ - Que sean 4 parámetros, si se pasan menos o más, mostrar por pantalla un mensaje descriptivo del error y terminar el proceso con algún codigo de error. - Que el archivo de entrada exista y tenga permisos de lectura. Si no existe mostrar por pantalla un mensaje del error. - Que "ubicación del campo cliente" se un numero >=1 y <= cantidad total de cmapos del registro de entrada. - Que "ubicación del campo monto" sea un numero >=1 y <= cantidad total de campos del registro de entrada - Que "ubicación del campo cliente" sea distinto a "ubicación del campo monto" - Que el archivo de salida no exista. Si existe, preguntar al usuario si desea sobre-escribirlo. Si indica "SI" o "si", entonces sobre-escribirlo, si indica "NO" o "no" , entonces cancelar el script mostrando mensaje de error. ===== Ejemplo ===== Archivo input (usando las 2da y 4ta columna):\\ \begin{array}{|c|c|c|c|c|} \hline & \mbox{Jose Perez} & &123.50 &\\ \hline & \mbox{Jose Gomez} & &-235& \\ \hline & \mbox{Jose Perez}& & -20.2 & \\ \hline \end{array} ===== Resolución ===== #!/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 = ); @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 = ; 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 = )) { @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;