Cátedra: Osvaldo Clua
Fecha: Primera Oportunidad - Segundo Cuatrimestre 2008
Día: 04/11/2008
Tema: 2 de PERL
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
Estructura de paises.tab (1 a n registros):
Codigo de Pais;Nombre (separador es punto y coma)
Ej: 613;Argentina
Ej: 815;Perú
#!/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); }
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
613;Argentina 815;Peru 123;Brasil 215;Colombia 175;Uruguay 127;Chile