====== Examen Parcial - 75.08. Sistemas Operativos ======
**Cátedra:** Osvaldo Clua\\
**Fecha:** Primera Oportunidad - Segundo Cuatrimestre 2008\\
**Día:** 04/11/2008\\
**Tema:** 2 de PERL
Esta página está incompleta; podés ayudar completando el material.
===== Enunciado =====
El Fondo Monetario Internacional recibe informes de los organismos internacionales de crédito (BID, Banco Mundial, etc) en donde se indican todos los préstamos otorgados en cada país.
**Código de País,Código de prestamo, Fecha de disponibilidad, Monto del Préstamo, Fecha de caducidad**
Ej: 613,ANR-1208,20070220,1200000,20090220
Ej: 613,ANR-OCQR,20061103,3000000,20091103
Los campos de los registros están separados por , En ambas fechas el formato es aaaammdd
Si el archivo lo envía el BID, el nombre del archivo es BIDnnn, donde nnn es un número de 3 dígitos secuencial.
Si el archivo lo envía el Banco MUndial, el nombre es BMnnn, donde nnn es un número de 3 dígitos secuencial.
**Se pide:**
Desarrollar un comando perl que reciba como parámetro el nombre del archivo que se quiere procesar (parámetro obligatorio) y un código de país (parámetro opcional). Si el código de país no se ingresa, tomar como valor de defecto el 613 que corresponde a Argentina y grabe un archivo de salida (informe.txt) con la siguiente información:
"Totales de préstamos puestos a disponbilidad por el (BID o BM según corresponda) en (nombre del país)"
"año xxxa u$s aaaa (suma de los montos de préstamos con fecha de disponibilidad en el año xxxa) dólares"
"año xxxb u$s bbbb (suma de los montos de préstamos con fecha de disponibilidad en el año xxxb) dólares"
etc.
**Condiciones de resolución**
- Es obligariorio el uso de **funciones perl** para separar y cortar los campos de los registros (NO USAR EXPRESIONES REGULARES en reemplazo de estas funciones)
- Es olbigatorio esl uso de una **estructura de hash** para efectuar la suma de los préstramos por año. El campo año es el que se debe emplear como clave y el campo monto es el que se debe acumular.
- Validar el nombre del archivo de entrada de acuerdo al formato especificado.
- Si el archivo de entrada no existe, mostrar en pantalla un mensaje de error.
- Validar el parámetro opcional si este es ingresado empleando la tabla de paises.tab
- Si el archivo de salida existe solocitar al ususario que ingrese un nuevo nombre de archivo de salida
- Cuando termina de procesar el archivo y graba la salida, terminar el programa
__Estructura de paises.tab (1 a n registros)__:
**Codigo de Pais;Nombre (separador es punto y coma)**
Ej: 613;Argentina
Ej: 815;Perú
===== Resuelto =====
#!/usr/bin/perl
( $#ARGV == -1 || $#ARGV > 4 ) && die "Error: cantidad de parámetros incorrecta.\n";
$archivo_salida = "informe.txt";
$codigo = "631";
$nombre = "Argentina";
$archivo_entrada = $ARGV[0];
$archivo_paises = "paises.tab";
$separador = ",";
$sep_paises = ";";
$organismo = "";
($archivo_entrada =~ /^BID\d{3}$/ && (($organismo="BID")) ) ||
($archivo_entrada =~ /^BM\d\d\d$/ && (($organismo="BM"))) ||
die "Error: Nombre del archivo incorrecto.\n";
open(ENTRADA, "<$archivo_entrada") || die "Error: No existe el archivo de entrada.\n";
if ($#ARGV == 1) {
$codigo = $ARGV[1];
open(PAISES, "<$archivo_paises");
$archivo = join("", );
$valido = "No";
@lineas = split(/\n/, $archivo);
foreach $reg (@lineas){
($pais, $nombre_pais) = split(/$sep_paises/, $reg);
if ("$pais" == "$codigo") {
$valido = "Si";
}
}
if ($valido eq "No"){
die "Error: el código pasado es inválido.\n";
}
close (PAISES)
}
open(SALIDA, "<$archivo_salida") && existe();
open(SALIDA, ">$archivo_salida");
$archivo = join("", );
@lineas = split("\n", $archivo);
%hash = ();
foreach $linea (@lineas){
@reg = split("$separador", $linea);
$cod = @reg[0];
$anio = @reg[2];
$anio =~ s/(\d{4})\d{4}/\1/g;
$monto = @reg[3];
if ($cod == $codigo){
if (exists($hash{$anio})){
$hash{$anio} += $monto;
} else {
$hash{$anio} = $monto;
}
}
}
print SALIDA "Totales de prestamos puestos a disponibilidad por el $organismo en $nombre:\n";
foreach $anio (keys(%hash)){
print SALIDA "año $anio u\$s $hash{$anio} dólares.\n";
}
close(ENTRADA);
close(SALIDA);
sub existe(){
print "Ingrese el nuevo nombre del archivo de salida: ";
$archivo_salida = ;
chop($archivo_salida);
}
==== Archivo de pruebas: BM123 ====
613,ANR-1208,20070220,1200000,20090220
613,ANR-OCQR,20061103,3000000,20091103
815,ANR-OCQR,20061103,3000000,20091103
127,cod,20001105,300,20081010
127,cod,20001105,30050,20081010
127,cod,20001105,300,20081010
613,ANR-1208,20070220,1200000,20090220
613,ANR-1208,20070220,1200000,20090220
613,ANR-1208,20070220,1200000,20090220
613,ANR-1208,20080220,200000,20090220
613,ANR-OCQR,20081103,3000000,20091103
==== Archivo de pruebas: paises.tab ====
613;Argentina
815;Peru
123;Brasil
215;Colombia
175;Uruguay
127;Chile