====== 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