Problème Expression Regulière

Résolu/Fermé
Ben - Modifié par jipicy le 1/04/2014 à 11:23
 Ben - 1 avril 2014 à 13:56
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 $_ ?

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

[Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 1 092
Modifié par [Dal] le 1/04/2014 à 12:39
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
0
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!
0