Problème Expression Regulière
Résolu
Ben
-
Ben -
Ben -
Bonjour à tous!
J'ai un petit problème avec une expression régulière. Lorsque j'exécute le code suivant, il me renvoi l'erreur "Use of uninitialized value $_ in pattern match etc...." au niveau du while.
Pourtant j'évite au maximum les variables automatiques, ma variable $barcode est définie il me semble, et à quel endroit utilise-t-il $_ ?
Bref je dois avouer que malgré mes recherches je ne vois pas ce qui n'est pas défini. Quelqu'un a une idée?
Merci beaucoup!
J'ai un petit problème avec une expression régulière. Lorsque j'exécute le code suivant, il me renvoi l'erreur "Use of uninitialized value $_ in pattern match etc...." au niveau du while.
Pourtant j'évite au maximum les variables automatiques, ma variable $barcode est définie il me semble, et à quel endroit utilise-t-il $_ ?
print "# Quel code-barre a ajouter (3 caracteres alphanumeriques) ?\n";
print "# Code-Barre: ";
my $barcode=<stdin>;
chomp $barcode;
while ($barcode != /[a-z0-9]{3}/ig){
print "# Le code-barre doit etre compose de 3 caracteres alphanumeriques!\n";
print "# Nouveau code-barre: ";
$barcode=<stdin>;
chomp $barcode;
}
Bref je dois avouer que malgré mes recherches je ne vois pas ce qui n'est pas défini. Quelqu'un a une idée?
Merci beaucoup!
2 réponses
-
Si tu utilises l'opérateur de différence numérique
=!
, Perl va évaluer ce qui est à droite pour tester l'absence d'égalité. Comme c'est une expression régulière, elle est évaluée dans $_ en l'absence d'autre affectation.
Ce n'est pas comme cela que tu testes une recherche d'expression régulière dans une variable Perl, c'est avec l'opérateur=~
.
Il faut faire une négation de ta regexp avec un look-ahead.
while ($barcode =~ /^(?!([a-z0-9]{3}$)).*$/ig){
Devrait produire de meilleurs résultats.
Dal -
Salut, merci de ta réponse!
Effectivement ça marche aussi, mais j'ai réglé le problème d'une autre façon, plus longue et plus lourde (remplacement while par until, plus de différence numérique mais =~, ajout d'un élement avant et après le $barcode pour vérifier l'éxactitutde du {3}...).
En tout cas ta méthode est plus légère et probablement plus robuste, merci!