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
}
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/>
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/>
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/>
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
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 ?
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/>
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/>
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/>