Lecture de date aléatoire.

Lecture de date aléatoire. - Perl - Programmation

Marsh Posté le 22-08-2006 à 23:56:00    

Bonsoir à tous.
 
Avant tout, et sans vouloir user de flatterie, bravo pour la qualité de vos réponses aux questions posées.
 
J'ai une question à poser qui, il me semble, n'a pas été traitée sur le forum et me pose problème.
J'ai créé un script Perl sous forme de modulle qui est sensé me donner la date et l'heure de mon serveur Apache.
Mais au lieu de donner l'heure en cours, il me renvoie une heure d'une page précédente.
 
Mais pour comprendre voici les fichiers :
 
** Module Perl **
**************

Code :
  1. #################################################
  2. # Module de traitement de la date et de l'heure #
  3. # locale.                                       #
  4. #################################################
  5. #         -- Fichier DateEdition.pm --          #
  6. #              -- Version HTML --               #
  7. #################################################
  8. # Créé le 12/08/2006
  9. # Mis à jour le 18/08/2006 --> Modification mineure par ajout du zéro avant le chiffre
  10. #                          --> des minutes et des secondes si <10.
  11. #
  12. #
  13. package DateEdition;
  14. my @alphajour=("dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi" );
  15. my @alphamois=("janvier","f&eacute;vrier","mars","avril","mai","juin","juillet","ao&ucirc;t","septembre","octobre","novembre","d&eacute;cembre" );
  16. my ($secondes,$minutes,$heure,$jmois,$mois,$annee1900,$jsemaine,$jannee,$hsaison) = "";
  17. my ($annee);
  18. local ($DtActuelle,$HrActuelle) = "";
  19. ($secondes,$minutes,$heure,$jmois,$mois,$annee1900,$jsemaine,$jannee,$hsaison)=localtime(time);
  20. # Ajout du zéro avant le chiffre des minutes et des secondes si < 10.
  21. if ($secondes<10)
  22.   {
  23.    $secondes = "0".$secondes;
  24.   }
  25. if ($minutes<10)
  26.   {
  27.    $minutes = "0".$minutes;
  28.   }
  29. # Mise à niveau de l'année.
  30. $annee = $annee1900 + 1900;
  31. # Traitement de la date.
  32. sub DtLocale
  33. {
  34. $DtActuelle = $alphajour[$jsemaine]." ".$jmois." ".$alphamois[$mois]." ".$annee;
  35. return ($DtActuelle);
  36. }
  37. # Traitement de l'heure.
  38. sub HrLocale
  39. {
  40. if ($hsaison==1)
  41.   {
  42.    $HrActuelle = $heure."h".$minutes."m".$secondes."s, heure locale d'&eacute;t&eacute;";
  43.   }
  44. else
  45.   {
  46.    $HrActuelle = $heure."h".$minutes."m".$secondes."s, heure locale d'hiver";
  47.   }
  48. return($HrActuelle);
  49. }
  50. 1;


** Affichage Date et Heure sur la console **
**********************************

Code :
  1. #!/usr/bin/perl -w
  2. use DateEdition;
  3. my ($DateLocale,$HeureLocale)=" ";
  4. DEBUT:
  5. $DateLocale  = &DateEdition::DtLocale;
  6. $HeureLocale = &DateEdition::HrLocale;
  7. print "\n";
  8. print "Nous sommes le ".$DateLocale." et il est ".$HeureLocale."\n\n";
  9. goto DEBUT;
  10. exit (0);


** Affichage Date et Heure dans document HTML **
***************************************

Code :
  1. #!/usr/bin/perl -w
  2. #
  3. # AfficheDateHTML.html
  4. #
  5. # Version 1.01
  6. # Script créé le 22/08/2006.
  7. #
  8. #
  9. use DateEdition;
  10. my ($DateLocale,$HeureLocale)=" ";
  11. # Génération de la date et l'heure.
  12. $DateLocale = &DateEdition::DtLocale;
  13. $HeureLocale = &DateEdition::HrLocale;
  14. # Corps du Script d'affichage des données.
  15. # En-tête de page HTML.
  16. print <<PAGE_HTML;
  17. Content-type:text/html
  18. <html>
  19. <head>
  20.   <title>Affiche la date et l'heure locale du serveur</title>
  21.    <meta name=\"author\" content=\"Joseph75\">
  22.    <meta http-equiv=\"pragma\" content=\"no-cache\">
  23.    <meta http-equiv=\"content-type\" content=\"text/html;charset=iso-8859-1\">
  24. </head>
  25. <body>
  26. <center>
  27.   <b>Affiche la date et l'heure locale du serveur.</b>
  28. </center>
  29. <hr>
  30. <center>
  31.   <b>Liste g&eacute;n&eacute;r&eacute;e le $DateLocale &agrave; $HeureLocale.</b>
  32. </center>
  33. </body>
  34. </html>
  35. PAGE_HTML
  36. exit(0);


Voilà les 3 fichiers.
Si quelqu'un a une idée ou des idées, alors je suis preneur car je sèche depuis quelques (10) jours.
 
Le phénomène est aussi visible si on modifie le code avec la version entourée par les goto.
 
Merci d'avance à vous tous et encore bravo.

Message cité 1 fois
Message édité par Joseph75 le 23-08-2006 à 00:21:32
Reply

Marsh Posté le 22-08-2006 à 23:56:00   

Reply

Marsh Posté le 23-08-2006 à 09:50:48    

Joseph75 a écrit :

Mais au lieu de donner l'heure en cours, il me renvoie une heure d'une page précédente.


 
Peux-tu être plus précis ?

Reply

Marsh Posté le 23-08-2006 à 11:31:54    

Elmoricq a écrit :

Peux-tu être plus précis ?


En fait il a l'heure du chargement du module...


---------------
Cdl, Danjer
Reply

Marsh Posté le 23-08-2006 à 14:08:56    

Danjer a écrit :

En fait il a l'heure du chargement du module...

C'est normal : tu évalues la fonction localtime une seule fois au chargement du module. Lors de tes appels ultérieurs aux fonctions HrLocale et DtLocale, tu ne fais que retourner l'heure/la date qui a été calculée au chargement.
Tu devrais encapsuler les lignes 21 à 36 dans une fonction qui serait appelée au début de HrLocale et de DtLocale pour récupérer la "vraie" heure/date courante.


---------------
TriScale innov
Reply

Marsh Posté le 23-08-2006 à 15:35:15    

Bonjour et merci pour vos réponses.
 
francesco, tu sous-tendrais qu'il faudrait que j'inclus

Code :
  1. use DateEdition;
  2. $DateLocale = &DateEdition::DtLocale;
  3. $HeureLocale = &DateEdition::HrLocale;
  4. print "Nous sommes le ".$DateLocale." et il est ".$HeureLocale."\n\n";


dans la boucle  
DEBUT:
 
goto DEBUT;
 
ou dans toute autre pour que la valeur soit re-calculée à chaque passage sur
use DateEdition ? Sinon, dans l'immédait, je ne vois pas comment faire.
 
Pour répondre aux deux autres questions, l'appel au module - DateEdition - est
inclus dans un script cgi-Perl du serveur Apache et il n'est << appelé >> que
lorsque l'on clique sur le lien mis sur ladite page.
 
Pour exemple <a href="/cgi-bin/AfficheDateHTML.pl">Affiche la date et l'heure</a>
 
Le recalcul ne se fait-il pas systématiquement lors de l'appel du script ?
 
Merci de vos réponses.

Reply

Marsh Posté le 23-08-2006 à 15:42:34    

De fait je n'avais pas fait attention que c'était un module que tu appelais.
 
Comme le dit franceso, la ligne :

($secondes,$minutes,$heure,$jmois,$mois,$annee1900,$jsemaine,$jannee,$hsaison)=localtime(time);


 
Il faut la déplacer/copier dans les fonctions DtLocale et HrLocale, autrement les variables sont initialisées une bonne fois pour toute au chargement du module, et jamais rafraîchies.

Reply

Marsh Posté le 23-08-2006 à 16:03:52    

Elmoricq a écrit :

... les variables sont initialisées une bonne fois pour toute au chargement du module, et jamais rafraîchies.


 
Ou dans le cas de ton CGI quand :  
  - apache est redemarre
  - si le fichier de ton module change (je me souviens plus... je crois)


---------------
Cdl, Danjer
Reply

Marsh Posté le 23-08-2006 à 16:07:35    

Joseph75 a écrit :

francesco, tu sous-tendrais qu'il faudrait que j'inclus [...] dans la boucle

Non, il faut que tu règles le problème dans ton module lui-même, pas dans le script qui y fait appel.
 
Dans le code de ton module, il faut que modifies les fonctions DtLocale et HrLocale pour qu'elles appellent elles-mêmes la fonction localtime(). Tes scripts incluant le module ne doivent pas être modifiés.


---------------
TriScale innov
Reply

Marsh Posté le 23-08-2006 à 16:11:10    

Merci,
 
c'est justement ce que je viens de faire et voici le code :
 

Code :
  1. #################################################
  2. # Module de traitement de la date et de l'heure #
  3. # locale.                                       #
  4. #################################################
  5. #         -- Fichier DateEdition.pm --          #
  6. #              -- Version HTML --               #
  7. #################################################
  8. # Créé le 12/08/2006
  9. # Mis à jour le 18/08/2006 --> Modification mineure par ajout du zéro avant le chiffre
  10. #                          --> des minutes et des secondes si <10.
  11. # Mis à jour le 23/08/2006 --> Modification majeure sur le traitement de localtime.
  12. #
  13. package DateEdition;
  14. my @alphajour=("dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi" );
  15. my @alphamois=("janvier","f&eacute;vrier","mars","avril","mai","juin","juillet","ao&ucirc;t","septembre","octobre","novembre","d&eacute;cembre" );
  16. my ($secondes,$minutes,$heure,$jmois,$mois,$annee1900,$jsemaine,$jannee,$hsaison) = "";
  17. my ($annee);
  18. local ($DtActuelle,$HrActuelle) = "";
  19. # Traitement de la date.
  20. sub DtLocale
  21. {
  22. ($secondes,$minutes,$heure,$jmois,$mois,$annee1900,$jsemaine,$jannee,$hsaison)=localtime(time);
  23. # Mise à niveau de l'année.
  24. $annee = $annee1900 + 1900;
  25. $DtActuelle = $alphajour[$jsemaine]." ".$jmois." ".$alphamois[$mois]." ".$annee;
  26. return ($DtActuelle);
  27. }
  28. # Traitement de l'heure.
  29. sub HrLocale
  30. {
  31. ($secondes,$minutes,$heure,$jmois,$mois,$annee1900,$jsemaine,$jannee,$hsaison)=localtime(time);
  32. # Ajout du zéro avant le chiffre des minutes et des secondes si < 10.
  33.   if ($secondes<10)
  34.    {
  35.     $secondes = "0".$secondes;
  36.    }
  37.   if ($minutes<10)
  38.    {
  39.     $minutes = "0".$minutes;
  40.    }
  41. if ($hsaison==1)
  42.   {
  43.    $HrActuelle = $heure."h".$minutes."m".$secondes."s, heure locale d'&eacute;t&eacute;";
  44.   }
  45. else
  46.   {
  47.    $HrActuelle = $heure."h".$minutes."m".$secondes."s, heure locale d'hiver";
  48.   }
  49. return($HrActuelle);
  50. }
  51. 1;


Si çà peut servir à quelqu'un ...
Merci à vous tous.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed