Newbie : adresse de tableau reconnu par regex ?

Le
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
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Paul GABORIT
Le #122516
À (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 - Perl en français -
ctemp1
Le #122244
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
Paul GABORIT
Le #122243
À (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 - Perl en français -
-- Thomas vO --
Le #122242
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/

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

A bientôt.

C. Tobini
Publicité
Poster une réponse
Anonyme