Vie Abr 25, 2008 7:15 am
|
 |
Reina
Perlero Nuevo

|
Registrado: 25 Abr 2008
Mensajes: 18
|
|
| Fechas en perl |
|
|
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!! |
|
|
|
Vie Abr 25, 2008 11:00 am
|
 |
monoswim
Vive para Perl en Español

|
Registrado: 18 Nov 2003
Mensajes: 720
Ubicación: Buenos Aires
|
|
|
|
Vie Abr 25, 2008 11:04 am
|
 |
kidd
Creador de Perl en Español

|
Registrado: 15 Oct 2003
Mensajes: 1390
Ubicación: México
|
|
|
|
|
Yo el módulo que uso para realizar comparaciones de fecha es Date::Calc.
Saludos |
|
Vie Abr 25, 2008 12:40 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4222
Ubicación: Valladolid, España
|
|
|
|
|
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]. |
|

Lun Abr 28, 2008 2:51 am
|
 |
Reina
Perlero Nuevo

|
Registrado: 25 Abr 2008
Mensajes: 18
|
|
|
|
|
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
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!! |
|

Lun Abr 28, 2008 7:57 am
|
 |
kidd
Creador de Perl en Español

|
Registrado: 15 Oct 2003
Mensajes: 1390
Ubicación: México
|
|
|
|
|
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 |
|

Lun Abr 28, 2008 8:12 am
|
 |
Reina
Perlero Nuevo

|
Registrado: 25 Abr 2008
Mensajes: 18
|
|
|
|
|
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!! |
|
Lun Abr 28, 2008 9:14 am
|
 |
Rene Serrano
Perlero Nuevo

|
Registrado: 27 Nov 2006
Mensajes: 82
Ubicación: El salvador CA
|
|
|
|
|
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 |
|
Lun Abr 28, 2008 1:58 pm
|
 |
kidd
Creador de Perl en Español

|
Registrado: 15 Oct 2003
Mensajes: 1390
Ubicación: México
|
|
|
|

Lun Abr 28, 2008 6:12 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4222
Ubicación: Valladolid, España
|
|
|
|
|
| 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'). |
|
Mie Abr 30, 2008 7:41 am
|
 |
Reina
Perlero Nuevo

|
Registrado: 25 Abr 2008
Mensajes: 18
|
|
|
|
|
Buenas Explorer,
He probado a poner la ruta completa del fichero y me da el mismo resultado ¿A qué puede ser debido?
Graciasªª
Besitos!!  |
|
Mie Abr 30, 2008 9:51 am
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4222
Ubicación: Valladolid, España
|
|
|
|
|
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";
} |
|
|
Lun May 05, 2008 12:49 am
|
 |
Reina
Perlero Nuevo

|
Registrado: 25 Abr 2008
Mensajes: 18
|
|
|
|
|
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...
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!! |
|

Lun May 05, 2008 1:18 am
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4222
Ubicación: Valladolid, España
|
|
|
|
|
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; |
|
|

Lun May 05, 2008 8:02 am
|
 |
Reina
Perlero Nuevo

|
Registrado: 25 Abr 2008
Mensajes: 18
|
|
|
|
|
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!! |
|
Powered by phpBB © 2001, 2005 phpBB Group
|