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

Newbie : adresse de tableau reconnu par regex ?

5 réponses
Avatar
ctemp1
Bonjour,

Je manipule des tableaux contenant des variables de types différents :
nombres, chaînes de caractères et adresses de tableaux.

Je cherche à gérer les entrées selon leur types mais je sais pas
comment rentrer comme critère une adresse :

si j'ai @tab = ( "Un", 2, \@array );
foreach(@tab) {
if ( $_ =~ /\d+/ ) {} pour un nombre
if ( $_ =~ /\w+/ ) {} pour une chaine de caractères
if ( ??? ) {} une adresse car en faisant plusieurs essais, il
semblerait que les adresses soient reconnues comme des nombres
}

Merci.

C. Tobini

5 réponses

Avatar
Paul GABORIT
À (at) 29 Apr 2004 07:19:39 -0700,
(C. Tobini) écrivait (wrote):
si j'ai @tab = ( "Un", 2, @array );
foreach(@tab) {
if ( $_ =~ /d+/ ) {} pour un nombre
if ( $_ =~ /w+/ ) {} pour une chaine de caractères
if ( ??? ) {} une adresse car en faisant plusieurs essais, il
semblerait que les adresses soient reconnues comme des nombres
}


Pour un nombre (entier) :

$_ =~ m/^d+$/ # que des chiffres depuis le début jusqu'à la fin

Pour une référence vers un tableau :

ref($_) eq 'ARRAY'

Une chaîne ne peut pas être distinguée d'un nombre ou d'une référence donc ça
doit être le tout dernier cas (celui par défaut). Une dernière chose : vous ne
saurez jamais (en tous cas pas via des regexp) si c'est "12" ou 12 qui a été
saisi.

Un exemple qui montre quelques pièges :

@tab = (@array, "ARRAY(0x2de18)", 123, "123");


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

Avatar
ctemp1
Merci beaucoup, ça fait exactement ce que j'attend.

Pour chaque valeur, je peux maintenant prendre comme critère un mot
clef d'une phrase, un nombre ou une adresse.

En revanche, quel est le critère de sélection d'un regex sur w+ ou
d+ pour les nombres ?

Comment se fait-il que w+ ou d+ sur un nombre retourne 'true' alors
que dans le cas de ABC123 /(w+)(d+)/ reconnaîtra bien les 2 types ?

C. Tobini
Avatar
Paul GABORIT
À (at) 30 Apr 2004 06:18:51 -0700,
(C. Tobini) écrivait (wrote):
En revanche, quel est le critère de sélection d'un regex sur w+ ou
d+ pour les nombres ?


Heu... ?


Comment se fait-il que w+ ou d+ sur un nombre retourne 'true' alors
que dans le cas de ABC123 /(w+)(d+)/ reconnaîtra bien les 2 types ?


Le code suivant :

if ("ABC123" =~ m/(w+)(d+)/) {
print "$1n$2n";
}

vous affiche :

ABC12
3

En fait w+ essaie de "manger" un maximum de caractères
(alphanumériques). Donc au premier essai, il "mange" tous les caractères. Mais
comme d+ veut lui aussi manger au moins 1 caractère, il y a un retour-arrière
(un backtrack). Le w+ essaie alors de manger un caractère de moins et laisse
donc le dernier pour d+ qui est lui aussi content. D'où le résultat.

Si vous ne voulez reconnaître que les lettres, vous pouvez utilisez [A-Za-z]
ou [[:alpha:]]. Ce qui donne :

if ("ABC123" =~ m/([[:alpha:]]+)(d+)/) {
print "$1n$2n";
}


Pour en savoir plus, il faut lire 'perlre'.

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

Avatar
-- Thomas vO --
Pour en savoir plus, il faut lire 'perlre'.


et/ou ça :

http://www.enstimac.fr/~vanouden/info/regexp_tutorial.pdf

--
Thomas vO -- Thomas van Oudenhove
http://www.enstimac.fr/~vanouden/

Avatar
ctemp1
Très bien, merci beaucoup pour votre aide et les références, j'y vois plus clair :)

A bientôt.

C. Tobini