Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

problème script cgi: Time::Local renvoie un tas d'erreurs

12 réponses
Avatar
gvdmoort
Bonjour =E0 tous,

J'ai un script qui fait appel =E0 Time::Local pour convertir un temps au
format YYYYMMDD en epoch et permettre des comparaisons entre des dates.

sub get_time {
$_[0]=3D~/(....)(..)(..)/;
$year =3D $1;
$month =3D $2;
$day =3D $3;
$date=3Dtimelocal(0,0,12,$day, $month-1, $year-1900);
# pour d=E9bugguer (voir le r=E9sultat plus loin) :
print STDERR "$year $month $day\n$date\n";
return $date;
}

Malheureusement, chaque appel =E0 cette fonction entra=EEne l'envoi de
ces messages vers STDERR:

Use of uninitialized value in integer addition (+) at
C:/perl/lib/Time/Local.pm line 76, <INDEX> line 393.
Use of uninitialized value in integer multiplication (*) at
C:/perl/lib/Time/Local.pm line 76, <INDEX> line 393.
Use of uninitialized value in integer multiplication (*) at
C:/perl/lib/Time/Local.pm line 76, <INDEX> line 393.
Use of uninitialized value in pack at C:/perl/lib/Time/Local.pm line
67, <INDEX> line 393.
Use of uninitialized value in pack at C:/perl/lib/Time/Local.pm line
67, <INDEX> line 393.
Use of uninitialized value in integer addition (+) at
C:/perl/lib/Time/Local.pm line 67, <INDEX> line 393.
2006 04 26
1146046210


Comme la comparaison s'effectue sur quelques centaines de dates, =E7a
fait quelques milliers de lignes d'erreur =E0 chaque fois.

Il semble que la sortie d'erreur standard soit redirig=E9e vers la
sortie standard pour les scripts CGI, en tout cas, la page s'affiche en
entrem=EAlant le code html normal et ces lignes d'erreur, et apr=E8s un
temps d=E9sesp=E9r=E9ment long. J'ai tent=E9 de rediriger les erreurs vers
un fichier :

open (STDERR,">errors.txt");

ce qui rend au script son temps d'ex=E9cution normal, mais il tourne
sur un serveur Windows, environnement auquel je ne connais rien, je le
confesse, et les visiteurs qui n'ont pas acc=E8s en =E9criture sur ce
r=E9pertoire ne peuvent cr=E9er ce fichier (on est dans l'intranet d'une
entreprise), et =E7a coince tout autant.

Quelqu'un a-t-il une id=E9e de l'origine de ces erreurs, et si elles ne
peuvent =EAtre r=E9solues, faute de mieux,
y aurait-il une grosse ficelle correspondant par exemple =E0 une
redirection vers /dev/null pour en =EAtre quitte ?

Merci d'avance,

G=2E

2 réponses

1 2
Avatar
jl_morel
Dans l'article ,
a dit...


À (at) 28 Apr 2006 09:41:06 GMT,
(Jean-Louis MOREL) écrivait (wrote):
Semble être un bug sous Windows avec Perl 5.8 (Time::Local 1.10)
mais pas sous Perl 5.6 (pas de numéro de version pour Time::Local)

À noter que la dernière version 1.12 ne passe pas tous les tests
sous Windows. (Il faut que j'investigue davantage, je n'arrive pas
à localiser les variables non définies avec des print. Il faut que
je regarde sous debug)


En tous cas, le bug a déjà été rencontré... et corrigé dans la version
1.11 :

<http://rt.cpan.org/Public/Bug/Display.html?id016>



Exact, la version 1.11 marche impec; mais pas la version 1.12 :-(
(mêmes warnings au numéros de ligne près).
La toute dernière version 1.12_1 marche à nouveau ;-)
(J'utilise Perl 5.8.6)

http://testers.cpan.org/show/Time-Local.html

Le bug vient de la fonction localtime qui, sous Windows, ne fonctionne pas
avec un argument négatif; elle renvoie une liste vide. Comme le module
teste les valeurs entières extrêmes, il y un problème avec l'appel
_timegm(localtime($time)) quand $time = -2147483648
La fonction _timegm n'a pas d'argument, alors elle râle.
(Toute cette partie a disparue dans la version 1.12_1)

J'ai placé Time::Local 1.12_1 dans mon dépot ppm :

http://www.bribes.org/perl/ppmdir.html

--
J-L.M.
http://www.bribes.org/perl


Avatar
Paul Gaborit
À (at) 28 Apr 2006 16:18:45 GMT,
(Jean-Louis MOREL) écrivait (wrote):
Le bug vient de la fonction localtime qui, sous Windows, ne
fonctionne pas avec un argument négatif; elle renvoie une liste
vide.


Bien vu. En lisant le source et la doc, je ne comprenais pas comment
on pouvait avoir ces erreurs vu que 'localtime' est censée retourner
une liste quoiqu'il arrive. Mais je n'avais pas lu 'perlport' où est
expliqué que, sous Windows, il ne faut pas appeler 'localtime' avec
une valeur négative... Ce qui m'embête dans perlport, c'est le "at
least" qui suis le "On Windows" ! ;-)

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>

1 2