IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Perl Discussion :

Regex + Array + Boucles


Sujet :

Langage Perl

  1. #1
    Membre du Club
    Inscrit en
    Avril 2006
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 101
    Points : 56
    Points
    56
    Par défaut Regex + Array + Boucles
    Bonjour, je voulais savoir s'il est possible d'entrer une variable à l'intérieur d'une regex. J'ai mis uen série de motif dans un tableau et je veux les parcourir. Je vous explique avec du code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    @tableau = ("a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z");
    $chaine = "abcde";
    foreach (@tableau){
     
    $oc = ($chaine =~ tr/\$_/*/);
    push @tableau2, $oc;
    }
    Cette ligne ci ne marche pas : $oc = ($chaine =~ tr/\$_/*/);
    La variable $_ magique contient au premier la lettre a, ensuite b...
    Mais le problème c'est que je n'ai pas le droit :S

    Comment faire pour injecter une variable d'un tableau qui change au tour pour tour dans une regex ?

    Merci de votre aide

  2. #2
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 572
    Points : 2 014
    Points
    2 014
    Par défaut
    Bonjour,

    je vois un problème dans ta syntaxe $oc = ($chaine =~ tr/\$_/*/);

    En mettant \ devant $_, tu demandes à perl d'interprêter le caractère $ exactement pour ce qu'il vaut : un $ et ça n'a plus rien à voir avec la variable $_ qui n'est pas extrapolée dans ce traitement.

    Un exemple vaudra mieux qu'un long discours :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $_ = 5;
    print "$_";    # affiche 5
    print "\$_";   # affiche $_ tout bêtement
    ensuite, je comprend pas trop : tu veux remplacer la lettre de ton tableau par quoi au juste ? Pourquoi une * en tant que valeur de remplacement ?

  3. #3
    Membre expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Points : 3 166
    Points
    3 166
    Par défaut
    Citation Envoyé par Girzi
    Comment faire pour injecter une variable d'un tableau qui change au tour pour tour dans une regex ?
    Comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    @tableau = ("a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z");
    $chaine = "abcde";
    foreach (@tableau){
     
    $oc = ($chaine =~ s/$_/*/);
    push @tableau2, $oc;
    }
    En l'occurence, il ne me semble pas que l'opérateur de translittération accepte de travailler sur une variable, alors que l'opérateur de substitution, si.
    On remplace donc tr par s et le tour est joué (et pas besoin d'antislasher le $ car le moteur devine "tout seul" que c'est une variable et pas une fin de ligne).
    La FAQ Perl est par ici
    : La fonction "Rechercher", on aurait dû la nommer "Retrouver" - essayez et vous verrez pourquoi !

  4. #4
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Par ailleurs, pour améliorer légèrement la lisibilité de ton code, et t'économiser des frappes inutiles (pour une prochaine fois en tout cas) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    my @tableau = ('a'..'z');
    --
    Jedaï

  5. #5
    Membre expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Points : 3 166
    Points
    3 166
    Par défaut
    Citation Envoyé par Jedai
    Par ailleurs, pour améliorer légèrement la lisibilité de ton code, et t'économiser des frappes inutiles (pour une prochaine fois en tout cas)
    +1

    Et pour les cas où de nombreuses lettres sont quand même nécessaire et s'il n'est pas possible d'utiliser la création de listes en .. (intervalles), il reste l'opérateur qw :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my @tableau = qw(a z e r t y u i o p s d f g h j k l m w x c v b n);
    La FAQ Perl est par ici
    : La fonction "Rechercher", on aurait dû la nommer "Retrouver" - essayez et vous verrez pourquoi !

  6. #6
    Membre du Club
    Inscrit en
    Avril 2006
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 101
    Points : 56
    Points
    56
    Par défaut
    Merci pour votre aide,
    seulement je veux utiliser Pour que le code me compte le nombre de fois que teli lettre apparait dans ma chaine de caractères (c'est pour ca que jutilise un tableau + une boucle)
    Mais avec tr/$_/*/ il ne semble pas vouloir
    Une idée ? Merci de votre aide

  7. #7
    Membre expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Points : 3 166
    Points
    3 166
    Par défaut
    Citation Envoyé par Girzi
    seulement je veux utiliser


    Comme je l'ai déjà dit, avec tr ce n'est pas possible.

    Il faut utiliser s///. Il est cependant possible d'en faire plusieurs à la fois avec le modificateur g :

    La FAQ Perl est par ici
    : La fonction "Rechercher", on aurait dû la nommer "Retrouver" - essayez et vous verrez pourquoi !

  8. #8
    Membre du Club
    Inscrit en
    Avril 2006
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 101
    Points : 56
    Points
    56
    Par défaut
    Merci pour ta réponse,
    mais le problème c'est que je ne veux pas remplacer une châine par une autre, mais compter le nombre doccurence dans un mot. Par exemple :
    hello, 1 h, 1 e, 2 l, 1 o ...

    Merci pour ton aide.

  9. #9
    Membre expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Points : 3 166
    Points
    3 166
    Par défaut
    Citation Envoyé par Girzi
    mais le problème c'est que je ne veux pas remplacer une châine par une autre
    C'est pourtant bien ce que fait l'opérateur tr/// ... tr/// ou s///g, dans notre cas, c'est rigoureusement équivalent.

    Citation Envoyé par Girzi
    mais compter le nombre doccurence dans un mot. Par exemple :
    hello, 1 h, 1 e, 2 l, 1 o ...
    Dans ce cas, il reste la possibilité de mémoriser la variable utilisée dans la substitution et de la réutiliser :
    La FAQ Perl est par ici
    : La fonction "Rechercher", on aurait dû la nommer "Retrouver" - essayez et vous verrez pourquoi !

  10. #10
    Membre du Club
    Inscrit en
    Avril 2006
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 101
    Points : 56
    Points
    56
    Par défaut
    Merci pour ton aide je comprends mieux maintenant

  11. #11
    Membre expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Points : 3 166
    Points
    3 166
    Par défaut
    Citation Envoyé par 2Eurocents
    Dans ce cas, il reste la possibilité de mémoriser la variable utilisée dans la substitution et de la réutiliser :
    Et comme en Perl, il y a toujours plus d'une façon de le faire, voici une autre solution. Un poil plus compliquée à comprendre mais beaucoup plus satisfaisante du point de vue conception (peut être plus performante, aussi) :En faisant ainsi, la variable est matchée, mais pas mémorisée, ce qui fait qu'il n'y a pas besoin de la remplacer puisqu'elle n'est pas supprimée (n'ayant pas été mémorisée).

    La FAQ Perl est par ici
    : La fonction "Rechercher", on aurait dû la nommer "Retrouver" - essayez et vous verrez pourquoi !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] array boucle while mots clé
    Par fx_web dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 09/10/2009, 13h05
  2. [Tableaux] Pseudos, array et boucle
    Par Woodgate dans le forum Langage
    Réponses: 3
    Dernier message: 12/09/2006, 14h33
  3. Réponses: 2
    Dernier message: 14/07/2006, 18h37
  4. Array, Boucle : Multiplication de l'Array
    Par moijhd dans le forum Flash
    Réponses: 4
    Dernier message: 15/06/2006, 13h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo