• Publicidad

Reducir script

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Reducir script

Notapor lis » 2008-12-17 11:51 @535

Hola amigos del foro. Tengo el siguiente script y quiero que me ayuden a reducirlo.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl -w

use LWP::Simple;
use strict;
use warnings;

# Constantes
my $URL_BASE = 'http://www.ncdc.noaa.gov/gibbs/image/GOE-12/IR';
my $IMG_FMT  = '%04d-%02d-%02d-%02d';
$|++;

# Bajar los imágenes
# Para los meses que tienen 31 días:
foreach my $anno ( 2004 ) {
foreach my $mes ( 1, 3, 5, 7, 8, 10, 12 ) {
foreach my $dia ( 1 .. 31 ) {
foreach my $hora ( 0, 3, 6, 9 ) {
my $imagen = sprintf $IMG_FMT, $anno, $mes, $dia, $hora;
print "Bajando imagen $imagen... ";
mirror( "$URL_BASE/$imagen", "$imagen.jpeg" );
print "Ok\n";}}}

#para los meses que tienen 30 días:
foreach my $mes ( 4, 6, 9, 11 ) {
foreach my $dia ( 1 .. 30 ) {
foreach my $hora ( 0, 3, 6, 9 ) {
my $imagen = sprintf $IMG_FMT, $anno, $mes, $dia, $hora;
print "Bajando fichero $imagen... ";
mirror( "$URL_BASE/$imagen", "$imagen.jpeg" );
print "Ok\n";}}}

#Para el mes de febrero que tiene 28 días:
foreach my $mes ( 2 ) {
foreach my $dia ( 1 .. 28 ) {
foreach my $hora ( 0, 3, 6, 9 ) {
my $imagen = sprintf $IMG_FMT, $anno, $mes, $dia, $hora;
print "Bajando fichero $imagen... ";
mirror( "$URL_BASE/$imagen", "$imagen.jpeg" );
print "Ok\n";}}}
}
Coloreado en 0.005 segundos, usando GeSHi 1.0.8.4


Yo separo los meses que tienen igual cantidad de días y repito el procedimiento 3 veces. A ver si me ayudan por favor, a hacer un solo procedimiento pera todos los meses respetando el número de días que tenga cada mes, muchas gracias y adiós.
lis
Perlero nuevo
Perlero nuevo
 
Mensajes: 106
Registrado: 2008-05-27 21:43 @946

Publicidad

Notapor explorer » 2008-12-17 12:48 @575

Creas una variable array llamada @dias_del, por ejemplo, en donde pones los días que tiene cada mes:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my @dias_del = qw(0 31 28 31 30 31 ...
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
(Notar que hay un 0 delante).

Luego, en el bucle de meses, recorres todos los valores:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
foreach my $mes ( 1 .. 12 )
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Y finalmente, en el bucle de días, recorremos desde el día 1 al último:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
foreach my $dia ( 1 .. $dias_del[$mes] )
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Con eso reduces los 3 bucles a uno.

Ahora te toca explicar porqué necesitamos un 0...
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor teco000 » 2008-12-18 14:27 @644

Ahora te toca explicar porqué necesitamos un 0


La verdad, explorer, ¿podrías explicarme qué significa que no se? :?
teco000
Perlero nuevo
Perlero nuevo
 
Mensajes: 67
Registrado: 2008-05-29 15:22 @682
Ubicación: Guatemala

Notapor explorer » 2008-12-18 14:33 @648

Le preguntaba a lis para que nos explicara, si lo sabe o intuye, del porqué necesitamos un 0 en el primer elemento de @dias_del. :)

Para hacerlo más claro... podríamos cambiar el 0 por otro número, por ejemplo, 85. O por una palabra, por ejemplo DiasDelMes. Pero, ¿por qué necesitamos ese elemento ahí?
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor lis » 2008-12-20 11:39 @527

Hola a todos y disculpen por no responder antes ya que me tome un tiempo para buscar la respuesta y lo único que encontré sobre la función qw() es que si tengo un string : @nombres = ("carlos", "alberto", "claudia"); con qw() puedo escribir de forma más sencilla el string:

Código: Seleccionar todo
@nombres = qw (carlos alberto claudia); o
@nombres = qw /carlos alberto claudia/; o
@nombres = qw 'carlos alberto claudia'; o
@nombres = qw {carlos alberto claudia}; o
@nombres = qw (
                 carlos
                 alberto
                 claudia
);


Pero por más que busqué información acerca de por qué debe ir ese 0 adelante, no la encontré, así que, según yo, creo que el 0 indica que ese es el orden a seguir de la cadena ¿o no?

Y gracias Explorer por ayudarme a reducir mi script.
lis
Perlero nuevo
Perlero nuevo
 
Mensajes: 106
Registrado: 2008-05-27 21:43 @946

Notapor explorer » 2008-12-20 12:19 @555

Pues no...

Lo que hace ese 0 es... no hacer nada... es decir... sí que hace algo: solo ocupar una posición (la primera posición del array). De esa manera, los días de los meses comienzan a partir del índice 1 del array, y así luego podemos poner en bucle for que vaya de 1 a 12. Sin él, hubiéramos tenido que hacer un bucle for(0 .. 11). Y ajustar más sentencias sabiendo que el número del mes era uno menos.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 3 invitados