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

  1. 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)
  2. 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.
  3. Validar el nombre del archivo de entrada de acuerdo al formato especificado.
  4. Si el archivo de entrada no existe, mostrar en pantalla un mensaje de error.
  5. Validar el parámetro opcional si este es ingresado empleando la tabla de paises.tab
  6. Si el archivo de salida existe solocitar al ususario que ingrese un nuevo nombre de archivo de salida
  7. 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("", <PAISES>);
    $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("", <ENTRADA>);
@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 = <STDIN>;
    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
materias/75/08/parcial_20081104_1perl.txt · Última modificación: 2008/11/15 12:44 por gsoriano
 
Excepto donde se indique lo contrario, el contenido de esta wiki se autoriza bajo la siguiente licencia: CC Attribution-Noncommercial-Share Alike 3.0 Unported


Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki