OVH Cloud OVH Cloud

[Debutante] Variable confirme a une date ?

15 réponses
Avatar
Mag
Bonjour,

J'ai une variable de ce type:

$ladate = '2010-03-21'

je souhaite faire un if qui ce declenche si la synthaxe de la variable
n'est pas la bonne, mais je ne sais pas faire. Quelqu'un pourrait m'aider ?


En gros, de temps en temps la variable est vide, la pas de probleme
un simple if($ladate eq "") la declenche, mais quand il y a par exemple
$ladate = 'uneerreur'
a savoir que ce n'est pas du 4chiffres-2chiffres-2chiffre

merci d'avance
mag

5 réponses

1 2
Avatar
espie
In article ,
Stephane CHAZELAS wrote:
2010-03-21, 14:43(+00), Marc Espie:
In article ,
Stephane CHAZELAS wrote:
2010-03-21, 11:30(+00), Marc Espie:
[...]
a savoir que ce n'est pas du 4chiffres-2chiffres-2chiffre




[...]
$ladate =~ m/^d{4}-d{2}-d{2}$/


[...]

$ladate =~ m/^d{4}-d{2}-d{2}$/

devrait suffire. Attention toutefois que ca valide
"2009-01-01n". On preferera peut-etre:



Pour une debutante, je prefere l'application des regles universelles.
Pas une lettre -> pour le sens normal.

D'ailleurs, ton truc marche aujourd'hui, mais sans garantie pour le futur.
Si un jour on decide que - a un sens particulier, ca cassera (d'accord, c'est
peu probable, mais perso, ca ne coute rien de ne pas prendre le risque, donc
je le fais).



Je ne sais pas pour perl, mais en general, c'est le contraire.
Quand une nouvelle version introduit un nouvel operateur, soit
elle casse la backward compatibility, et alors on s'en fout on
ne peut rien y faire, , soit elle fera en sorte de preserver la
backward compatibility en introduisant des operateurs qui ne
clasheront pas avec ce qui etait utilisé avant.

C'est le cas des { dans les BRE par exemple. Les scripts
d'avant l'introduction n'avaient aucune raison d'utiliser {
puisque { n'etait pas speciaux, donc c'est safe d'introduire {.

Dans les RE standard, d'ailleurs la norme dit que le
comportement des "" suivi par un x symbol ou x n'est pas
defini dans la norme est "unspecified" ce qui permet a des
implementations de le supporter en tant qu'extension a la norme.




Oui, ben ici, on parle de perl (comp.lang.perl, hein), et precisement,
dans perl, ce genre de choses est explicitement prevu. La regle universelle
est la suivante: TOUT caractere special peut etre precede d'un pour avoir
le caractere lui-meme, independamment de savoir si ce dernier est normalement
bizarre ou pas.

C'est un des enormes avantages par rapport aux regexp d'a peu pres n'importe
quoi d'autre. Ce que tu ne sais pas ne peut pas t'embeter, a condition
de mettre des quand tu n'es pas sur.

Si perl 6 introduit "-" comme operateur de regexp, alors il
casse sans equivoque la backward compatibility.



compatibilite avec quoi ? les regexp de perl *sont* des regexps de perl.
Elles sont de tres loin liees a ce que tu evoques, mais elles ont ete etendues
et modifiees et regularisees depuis des annees. Elles constituent un des
gros atouts du langage, par rapport aux autres trucs ou il faut toujours
regarder ce que fait ( ou ( selon les cas... au point d'avoir engendre une
bibliotheque tellement les gens trouvaient ca pratique.

Je ne vois pas trop l'interet de se poser la question du retour a la ligne
a la fin... perl fait a peu pres tout pour qu'on s'en foute, donc sauf mention
explicite de problemes lies a ca, je fais comme perl et j'ignore...



Je ne vois pas pourquoi un newline poserait moins de probleme
qu'un autre caractere. En general, c'est plutot le contraire.
(voir l'exemple des CGI qui envoient des mails par un pipe a
sendmail et pour qui l'introduction d'un newline dans les
headers signifie un nouveau header (comme Bcc, From, Reply-To),
j'ai deja vu le cas d'un "Subject: $q->param("subject")"
exploité pour envoyer des spams (en passant "xxxnTo: ..." comme
"subject")).



sans savoir ce que veut faire le poster, difficile de repondre.

De toutes facons, matcher une date ne suffira pas a l'untainter,
donc le probleme d'eventuels exploits, s'il se pose, se reglera
differemment...

Dans le cas que tu cites, le gus qui a pondu le CGI merite quelques baffes.
L'utilisation bien sentie de -T, c'est quand meme la base pour tout script
de ce genre...
Avatar
Stephane CHAZELAS
2010-03-21, 21:12(+00), Marc Espie:
[...]
et modifiees et regularisees depuis des annees. Elles constituent un des
gros atouts du langage, par rapport aux autres trucs ou il faut toujours
regarder ce que fait ( ou ( selon les cas... au point d'avoir engendre une
bibliotheque tellement les gens trouvaient ca pratique.


[...]

Mais tu viens de dire que tous les caracteres non-lettre
devraient etre precedés d'un parce qu'ils pourraient devenir
speciaux dans une version future, je ne suis pas sur qu'on y
gagne en lisibilité.

Si perl 6 introduit "-" comme operateur de regexp, alors il
casse sans equivoque la backward compatibility.



compatibilite avec quoi ?


[...]

Avec perl 5.

Un script ecrit pour perl 5 qui fait $x =~ /foo-bar/

ne marchera plus avec perl 6 si perl 6 introduit "-" comme
operateur de regexp.

$ file $^path/*(*.LK-100) | awk -F: '/perl/{print $1}' | xargs perl -lne 'print "$ARGV[0]: $&" if m{~ *[ms]?/(?>.|[^[/-])*-.*?/}' | wc -l
334

Me dit qu'il y en a.

[...]
Dans le cas que tu cites, le gus qui a pondu le CGI merite quelques baffes.
L'utilisation bien sentie de -T, c'est quand meme la base pour tout script
de ce genre...



D'accord, mais une autre erreur serait de se reposer totalement
sur "-T" et de ne pas reflechir un peu.

Mon probleme c'est que $x = /^d{4}-d{2}-d{2}$/ est misleading
car il ne fait pas ce qu'il suggere qu'il fait.

--
Stéphane
Avatar
Paul Gaborit
À (at) Sun, 21 Mar 2010 22:13:12 +0000 (UTC),
Stephane CHAZELAS écrivait (wrote):

2010-03-21, 21:12(+00), Marc Espie:
[...]
et modifiees et regularisees depuis des annees. Elles constituent un des
gros atouts du langage, par rapport aux autres trucs ou il faut toujours
regarder ce que fait ( ou ( selon les cas... au point d'avoir engendre une
bibliotheque tellement les gens trouvaient ca pratique.


[...]

Mais tu viens de dire que tous les caracteres non-lettre
devraient etre precedés d'un parce qu'ils pourraient devenir
speciaux dans une version future, je ne suis pas sur qu'on y
gagne en lisibilité.



C'est pourtant le (bon) conseil donné depuis toujours par la
documentation pour écrire des regexp en Perl. Et c'est exactement ce que
fait la fonction 'quotemeta'.

Un script ecrit pour perl 5 qui fait $x =~ /foo-bar/

ne marchera plus avec perl 6 si perl 6 introduit "-" comme
operateur de regexp.



C'est tout à fait cela... sauf si ce script est compilé en mode
compatibilité Perl5.

--
Paul Gaborit - <http://perso.mines-albi.fr/~gaborit/>
Perl en français - <http://perl.mines-albi.fr/>
Avatar
espie
In article ,
Stephane CHAZELAS wrote:
2010-03-21, 21:12(+00), Marc Espie:
Dans le cas que tu cites, le gus qui a pondu le CGI merite quelques baffes.
L'utilisation bien sentie de -T, c'est quand meme la base pour tout script
de ce genre...



D'accord, mais une autre erreur serait de se reposer totalement
sur "-T" et de ne pas reflechir un peu.



Il n'y a que toi qui parles de se reposer totalement sur "-T" ici.
Il est evident que -T n'exclus pas de reflechir un peu, mais deja, -T
permet d'eviter un certain nombre d'erreurs embarrassantes, pourquoi
s'en priver.

Mon probleme c'est que $x = /^d{4}-d{2}-d{2}$/ est misleading
car il ne fait pas ce qu'il suggere qu'il fait.



Misleading pour toi, car il ne fait pas ce que tu penses qu'il devrait
faire... tres pratique pour une grosse partie du reste du monde, parce
qu'il fait exactement ce qu'on lui demande: valider une chaine de
caracteres, independamment d'un n qui pourrait trainer par la.

Perso, si j'ai un n potentiel qui m'embete, je vais utiliser chomp, et
pas z... sauf cas tres exceptionnel.
Avatar
Stephane CHAZELAS
2010-03-22, 09:50(+00), Marc Espie:
In article ,
Stephane CHAZELAS wrote:


[...]
Mon probleme c'est que $x = /^d{4}-d{2}-d{2}$/ est misleading
car il ne fait pas ce qu'il suggere qu'il fait.



Misleading pour toi, car il ne fait pas ce que tu penses qu'il devrait
faire... tres pratique pour une grosse partie du reste du monde, parce
qu'il fait exactement ce qu'on lui demande: valider une chaine de
caracteres, independamment d'un n qui pourrait trainer par la.

Perso, si j'ai un n potentiel qui m'embete, je vais utiliser chomp, et
pas z... sauf cas tres exceptionnel.


[...]

Tu vas typiquement utiliser chomp quand tu t'attends a avoir un
n terminal comme quand tu lis du texte d'un fichier ou texte,
probablement pas quand tu ne t'y attends pas (comme quand
l'input vient de @ARGV, @_ ou %ENV ($QUERYSTRING, $PATH par
exemple))

Peut-etre que cette discussion fera prendre conscience de ce
risque a quelqu'un.

--
Stéphane
1 2