Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 

Fechas en perl
Ir a página 1, 2  Siguiente
 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Básico
Mensaje Vie Abr 25, 2008 7:15 am
Reina
Perlero Nuevo
Perlero Nuevo
Registrado: 25 Abr 2008
Mensajes: 18
Fechas en perl Responder citando

Buenas tardes:

Necesito realizar un script con perl que me coja la fecha actual y me la compare con la última fecha de actualización del antivirus.

El script en cuestión lo tengo pero hecho en java y no sé cómo se trabaja con fechas en perl.

¿Alguien me puede ayudar o recomendarme algún manual para tontos ;p?

Gracias!!
Mensaje Vie Abr 25, 2008 11:00 am
monoswim
Vive para Perl en Español
Vive para Perl en Español
Registrado: 18 Nov 2003
Mensajes: 720
Ubicación: Buenos Aires
Responder citando

Colocá la palabra fechas en el buscador de este foro, encontrarás cosas como

http://perlenespanol.baboonsoftware.com/foro/viewtopic.php?t=652

Saludos
Mensaje Vie Abr 25, 2008 11:04 am
kidd
Creador de Perl en Español
Creador de Perl en Español
Registrado: 15 Oct 2003
Mensajes: 1390
Ubicación: México
Responder citando

Yo el módulo que uso para realizar comparaciones de fecha es Date::Calc.


Saludos
Mensaje Vie Abr 25, 2008 12:40 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4222
Ubicación: Valladolid, España
Responder citando

Bienvenido a los foros de Perl en Español, Reina.

Para obtener la fecha del sistema puedes usar la función time(). Y para saber la fecha del fichero antivirus, puedes usar la función stat().

Las dos funciones te devolverán la fecha en forma de segundos desde el epoch. Pero eso a ti no te importa, en valores absolutos. Solo te interesa su diferencia.

Así, con (stat('antivirus.dat'))[9] <=> time() te devolverá -1, 0 y 1 según el fichero antivirus.dat sea más viejo, igual, o más joven que la fecha actual. Si lo que quieres es saber cuánto, entonces sí que habrá que hacer la diferencia: time() - (stat('antivirus.dat'))[9].
Mensaje Lun Abr 28, 2008 2:51 am
Reina
Perlero Nuevo
Perlero Nuevo
Registrado: 25 Abr 2008
Mensajes: 18
Responder citando

Buenos días explorer:

Muchas gracias por tu bienvenida, la verdad es que cuando una es nueva en este mundillo y no sabe muy bien cómo moverse se agradecen los detalles.

Bueno, te escribo primero para decirte que tu ayuda de momento me está sirviendo, pero necesito un poco más de tus conocimientos Smile

Este es el script que estaba haciendo:

Perl:
$ultactantivirus=(stat('dinfo.dat'))[9];
$fechaactual=time();
$comparacion=(stat('dinfo.dat'))[9]<=>time();
$resultado=time()-(stat('dinfo.dat'))[9];
print "$ultactantivirus,$fechaactual,$comparacion,$resultado";


y este es el resultado que me genera:
Código:
, 1209372423, -1, 1209372423


Como verás, intento visualizar la fecha de actualización del antivirus y no me saca nada, la fecha actual coincide con lo denominado resultado y no es posible, y lo único que está bien es la comparación, ya que tuvo lugar el viernes pasado y por eso devuelve un -1.

Podrías ayudarme por favor? Además de lo que quiero visualizar, me gustaría que me dijera cuántos días hace que se hizo la última actualización del antivirus.

Estoy segura de que es una tontería, pero... llevo un rato peleándome y no consgigo nada.

Gracias de antemano.

Besitos!!
Mensaje Lun Abr 28, 2008 7:57 am
kidd
Creador de Perl en Español
Creador de Perl en Español
Registrado: 15 Oct 2003
Mensajes: 1390
Ubicación: México
Responder citando

Hola,

Haciendo uso del módulo Date::Calc podemos lograr lo que tu quieres de manera sencilla:

Perl:
#!/usr/bin/perl

use warnings;
use strict;
use Date::Calc qw( Today_and_Now Delta_DHMS Date_to_Text Date_to_Text_Long Language Time_to_Date );

Language(4); #Cambiamos el idioma de Date::Calc a Español: 4

my $ultactantivirus=(stat('dinfo.dat'))[9];

print ultima_actualizacion($ultactantivirus);


sub ultima_actualizacion{

    my $fecha = shift;

    my @fecha_i = Time_to_Date($fecha);

    my @fecha_e = Time_to_Date(time);

    #Tomamos el intervalo entre ambas fechas
    my ($Dd,$Dh,$Dm,$Ds) = Delta_DHMS(@fecha_i, @fecha_e);

    #Regresamos el formato correcto
    if( $Dd && $Dd > 31 ){
        return Date_to_Text(@fecha_i[0..2]);
    }
    elsif( $Dd && $Dd < 31 ){
        return "Hace $Dd " . ( $Dd > 1 ? "días" : "día" );
    }
    elsif( $Dh && $Dh < 24 ){
        return "Hace $Dh " . ( $Dh > 1 ? "horas" : "hora" );
    }
    elsif( $Dm && $Dm < 60 ){
        return "Hace $Dm " . ( $Dm > 1 ? "minutos" : "minuto" );
    }
    elsif( $Ds && $Ds < 60 ){
        return "Hace $Ds " . ( $Ds > 1 ? "segundos" : "segundo" );
    }
    else{
        return Date_to_Text(@fecha_i[0..2]);
    }

} #sub ultima_actualizacion


Realizas la llamada a la función ultima_actualizacion() enviando la fecha que deseas comparar con la fecha actual como único argumento. La función te regresará resultados como:

Código:
Hace 5 segundos
Hace 15 minutos
Hace 1 día
...etc


Si la fecha es mayor a 31 días, entonces regresará el texto de la fecha que fue enviada a la función.

Saludos
Mensaje Lun Abr 28, 2008 8:12 am
Reina
Perlero Nuevo
Perlero Nuevo
Registrado: 25 Abr 2008
Mensajes: 18
Responder citando

Buenas tardes Kidd:

Muchas gracias por tu ayuda, pero cuando intento ejecutar el código en la consola me da error en estas dos líneas:

Perl:
use Date::Calc qw( Today_and_Now Delta_DHMS Date_to_Text Date_to_Text_Long Language Time_to_Date );

Language(4);

¿Sabes a qué se puede deber?

Gracias por todo.

Besitos!!
Mensaje Lun Abr 28, 2008 9:14 am
Rene Serrano
Perlero Nuevo
Perlero Nuevo
Registrado: 27 Nov 2006
Mensajes: 82
Ubicación: El salvador CA
Responder citando

Lo más seguro es que tiene que instalar ese módulo; dependiendo de tu S.O hay maneras de instalarlo. Si estás en Windows, desde la consola de ActivePerl.

Saludos
Mensaje Lun Abr 28, 2008 1:58 pm
kidd
Creador de Perl en Español
Creador de Perl en Español
Registrado: 15 Oct 2003
Mensajes: 1390
Ubicación: México
Responder citando

Sin ver el mensaje de error, como dice René, lo más seguro es que el problema sea que no tienes el módulo Date::Calc instalado en tu distribución de Perl.

Si tienes Windows con el ActivePerl entonces lo puedes instalar de manera sencilla usando el ppm:
http://perlenespanol.baboonsoftware.com/tutoriales/modulos/instalar_modulos_usando_el_ppmexe.html

En caso de que tengas un sistema tipo *nix entonces lo puedes hacer por medio del comando cpan.

Saludos
Mensaje Lun Abr 28, 2008 6:12 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4222
Ubicación: Valladolid, España
Responder citando

Reina escribió:
Este es el script que estaba haciendo:

Perl:
$ultactantivirus=(stat('dinfo.dat'))[9];
$fechaactual=time();
$comparacion=(stat('dinfo.dat'))[9]<=>time();
$resultado=time()-(stat('dinfo.dat'))[9];
print "$ultactantivirus,$fechaactual,$comparacion,$resultado";


y este es el resultado que me genera:
Código:
, 1209372423, -1, 1209372423
Si la función stat('dinfo.dat') no devuelve ningún resultado es porque ese fichero no existe en el directorio donde está trabajando tu programa Perl.

Prueba a poner el camino completo. Por ejemplo stat('C:/Archivos de programa/Antivirus/dinfo.dat').
Mensaje Mie Abr 30, 2008 7:41 am
Reina
Perlero Nuevo
Perlero Nuevo
Registrado: 25 Abr 2008
Mensajes: 18
Responder citando

Buenas Explorer,

He probado a poner la ruta completa del fichero y me da el mismo resultado Rolling Eyes ¿A qué puede ser debido?

Graciasªª

Besitos!! Wink
Mensaje Mie Abr 30, 2008 9:51 am
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4222
Ubicación: Valladolid, España
Responder citando

Prueba esto y nos dices qué sale.
Perl:
my $fichero = 'C:/Archivos de programa/Antivirus/dinfo.dat';
die "El fichero NO existe\n" if ! -e $fichero;
my @stat = stat($fichero);
die "No se pudo obtener información\n" if ! @stat;
foreach $i (0 .. $#stat) {
    print "Valor $i\t$stat[$i]\n";
}
Mensaje Lun May 05, 2008 12:49 am
Reina
Perlero Nuevo
Perlero Nuevo
Registrado: 25 Abr 2008
Mensajes: 18
Responder citando

Buenas explorer,

He probado el script que me pasaste y me dice que el fichero NO existe, pero después recorro la ruta y está ahí, no entiendo nada... Crying or Very sad

La ruta del .dat es 'C:\Archivos de programa\Archivos comunes\Symantec Shared\VirusDefs\dinfo.dat' ¿Puede ser que al tratarse del mismo antivirus para todo un dominio haya que tratarlo de distinta manera?

¡¡Gracias!!
Mensaje Lun May 05, 2008 1:18 am
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4222
Ubicación: Valladolid, España
Responder citando

Pues... no tengo ni idea de qué es lo que puede estar pasando...

A la hora de poner caminos de ficheros, yo, cuando trabajaba en Windows, tenía la precaución de: ponerlo siempre entrecomillado simple y usar '/' en lugar de '\' (Perl sabe cuándo había que darle la vuelta.

En tu caso quedaría:
Perl:
my $fichero = 'C:/Archivos de programa/Archivos comunes/Symantec Shared/VirusDefs/dinfo.dat';


Otra cosa que puedes probar es ir haciendo chdir() para ir entrando poco a poco y ver si es que hay algún nivel de directorio o carpeta que por sus permisos no te deje entrar o leer el fichero.

Otra cosa importante y que se me ha pasado. Dentro de los die() anteriores, prueba a colocar la variable $! para que Perl te saque el error del sistema que ha ocurrido. Por ejemplo:

Perl:
die "El fichero NO existe: $!\n" if ! -e $fichero;
Mensaje Lun May 05, 2008 8:02 am
Reina
Perlero Nuevo
Perlero Nuevo
Registrado: 25 Abr 2008
Mensajes: 18
Responder citando

Buenas, explorer:

¿A qué no sabes a quién le ha salido ya el script? Sí, sí, a mí, ¡¡ullueee!!

Muchas gracias por todo, la verdad es que sin vuestra ayuda no lo habría conseguido.

Sólo una pregunta más:

La fecha de actualización que me sale del antivirus, corresponde con la fecha de modificación del archivo .dat (la que podemos obtener si miramos las propiedades del archivo), en cambio, si abrimos éste, podemos comprobar que la fecha de actualización que muestra es anterior a la que teníamos. Hay alguna manera de abrir el archivo para coger esa fecha en vez de la que viene en las propiedades (que corresponde a la hora en la que se encendió el ordenador por la mañana) y modificarla, ya que aparece como CurDefs=20080504.003.

¡¡Gracias!!
Publicar nuevo tema   Responder al tema    Foros de discusión -> Básico Todas las horas son GMT - 6 Horas
Ir a página 1, 2  Siguiente
Página 1 de 2



Powered by phpBB © 2001, 2005 phpBB Group