Problème Expression Regulière [Résolu/Fermé]

Signaler
-
 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 $_ ?

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

Messages postés
5541
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
7 mai 2021
933
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!