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 :

Trouver les mots qui diffèrent de deux caractères.


Sujet :

Langage Perl

  1. #1
    Membre régulier
    Homme Profil pro
    Ingénieur système
    Inscrit en
    Octobre 2011
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur système
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 63
    Points : 103
    Points
    103
    Par défaut Trouver les mots qui diffèrent de deux caractères.
    Bonjour à tous.

    Je doit créer un script en Perl mais ce dernier me pose plusieurs problèmes.

    Tout d'abord je doit remplacer différents caractères dans un fichier mais lorsque je souhaite remplacer les lettres accentuées par des lettre non accentuées je me retrouve avec des résultats surprenants.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    open (FICH, ">>", $txt)  or die ("Impossible d'ouvrir le fichier $fichier :$! \n") ;	
    while (<>) {
     
    	tr/A-Z/a-z/ ;
    	tr/àáâãäåçèéêëìíîïñòóôõöùúûüýÿ/aaaaaaceeeeiiiinooooouuuuyy/;
    	s/[,.;:\!\?\'\"]/ /g;
            s/ /\n/g;
    	print FICH $_;
    }
    close (FICH);
    et voila les résultats renvoyée pour plusieurs mots :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    fumée->fumaoe
    étoiles->aotoiles
    kilomètres->kilomantres.
    Mon autre problèmes est que je doit trouver dans un tableau nommé @dico des mots qui ont 2 lettres de différences avec les mots stockées dans un tableau nommé @k.

    Par exemple pour qu je doit trouver les mots comme "que, quoi, qui...".

    Merci d'avance.

  2. #2
    Membre confirmé
    Avatar de Schmorgluck
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    371
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2006
    Messages : 371
    Points : 558
    Points
    558
    Par défaut
    Pour ton premier problème, c'est une histoire d'encodage des caractères.

    Pour ton second, est-ce qu'une regex du genre /\b$debut\w\w\b/ ferait l'affaire ?

  3. #3
    Membre régulier
    Homme Profil pro
    Ingénieur système
    Inscrit en
    Octobre 2011
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur système
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 63
    Points : 103
    Points
    103
    Par défaut rep
    En faite pour mon premier problème, il remplace bien le caractère accentuée mais par tout les caractères qui ont le même accent.
    Par exemple pour fumée, il va remplacer é par aoe car dans mon expression il y a : "á,ó,é".
    Et je n'arrive pas à comprendre pourquoi? Si c'est un problème d'encodage comment le régler?

    Je testerai l'expression régulière demain mais si vous avez d'autres idées elles sont toujours les bien venus.

    Merci beaucoup.

  4. #4
    Membre confirmé
    Avatar de Schmorgluck
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    371
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2006
    Messages : 371
    Points : 558
    Points
    558
    Par défaut
    Citation Envoyé par I'mSky Voir le message
    En faite pour mon premier problème, il remplace bien le caractère accentuée mais par tout les caractères qui ont le même accent.
    Par exemple pour fumée, il va remplacer é par aoe car dans mon expression il y a : "á,ó,é".
    Nope, dans fumée il a remplacé "é" par "ao", pas par "aoe". Comme dans "étoile".
    Et si c'était le cas, "kilomètres" donnerait "kilomaiutre" ou "kilomeaiutre", pas kilomantre.

    Ton problème vient du fait que tes données en entrée sont encodées avec un format de caractères à tailles variables, et que perl, par défaut, attend des caractères ASCII. Je ne me souviens plus quel module permet de gérer ça.

  5. #5
    Membre régulier
    Homme Profil pro
    Ingénieur système
    Inscrit en
    Octobre 2011
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur système
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 63
    Points : 103
    Points
    103
    Par défaut
    La regex que tu m'as donnée a l'air d'être celle que je souhaite utilisée mais je ne vois pas comment l'utiliser pour comparer des chaînes de caractères qui se trouve dans deux tableau différents.

    Les mots ayant une faute se trouve dans un tableau ("@k") et les mots qui peuvent être des solutions se trouvent dans un autre ("@dico"). Je souhaite donc parcourir le tableau "@dico" entièrement pour chaque ligne de "@k) et afficher les mots qui correspondent à la regex.

    Merci d'avance.

  6. #6
    Membre actif

    Profil pro
    Inscrit en
    Août 2009
    Messages
    156
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 156
    Points : 211
    Points
    211
    Par défaut
    Ton programme fonctionne au niveau des accents chez moi,
    tu n'aurais pas un problème d'encoding de ton fichier perl par rapport à la langue de ton terminal ?

    Vérifie avec od que ton résultat est cohérent et que chaque caractère est bien sur un seul octet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    od -c test_perl.pl
    0000000   #   !   /   b   i   n   /   p   e   r   l  \n  \n   w   h   i
    0000020   l   e       (   <   >   )       {  \n  \t   t   r   /   A   -
    0000040   Z   /   a   -   z   /       ;  \n  \t   t   r   /   à   á   â
    0000060   ã   ä   å   ç   è   é   ê   ë   ì   í   î   ï   ñ   ò   ó   ô
    0000100   õ   ö   ù   ú   û   ü   ý   ÿ   /   a   a   a   a   a   a   c
    0000120   e   e   e   e   i   i   i   i   n   o   o   o   o   o   u   u
    0000140   u   u   y   y   /   ;  \n  \t   s   /   [   ,   .   ;   :   \
    0000160   !   \   ?   \   '   \   "   ]   /       /   g   ;  \n
    0000200                           s   /       /   \   n   /   g   ;  \n
    0000220  \t   p   r   i   n   t       $   _   ;  \n   }  \n  \n
    0000236
    Dans mon exemple, sur la ligne 00000040 et 00000060 tu retrouves biens tous les caractères accentués, et ils sont tous sur un seul octet.
    Ensuite, si je tape fumée je récupère bien fumee.

  7. #7
    Membre régulier
    Homme Profil pro
    Ingénieur système
    Inscrit en
    Octobre 2011
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur système
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 63
    Points : 103
    Points
    103
    Par défaut
    Bon tu avais raison, j'ai bien un problème d'encodage mais comment le régler?

    De plus j'ai trouvé une solution pour parcourir mes tableaux et faire le test mais j'ai l'impression que la regex qui m'as été donnée par Schmorgluck ne fonctionne pas ou alors je ne la comprend pas.

    J'essaye de faire ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if ($element=/\b$ligne\w\w\b/){
    		 	print "$ligne : $element \n";
    		}
    $element étant les mots de mon dictionnaire et $ligne les mots qui comportent une faute.
    J'ai une erreur dans le terminal qui est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Use of uninitialized value $_ in pattern match (m//) at ...
    Merci d'avance.

  8. #8
    Membre actif

    Profil pro
    Inscrit en
    Août 2009
    Messages
    156
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 156
    Points : 211
    Points
    211
    Par défaut
    L'erreur veut dire ce qu'elle dit, tu as forcément un cas où ton $ligne doit être vide.
    Teste ta boucle en rajoutant des affichage, mais si Perl te dit "variable non initialisée", c'est qu'elle n'est pas initialisée ... Tout simplement. La seule solution c'est déboggage ou dérouler ton script à la main sur papier pour bien comprendre le déroulement !

    Pour le problème d'encodage, ça dépend :
    - de l'encodage de ton éditeur s'il est "externe" (souvent, tu as des options, pour utiliser UTF8 ou autre)
    - du paramètre LANG de ta session Unix/Linux (locale -a va te lister toutes les langues disponibles).
    Pour faire marcher mon exemple, j'ai utilisé LANG=fr_FR, et vi comme éditeur directement dans le terminal où j'avais paramétré la LANG.

  9. #9
    Membre régulier
    Homme Profil pro
    Ingénieur système
    Inscrit en
    Octobre 2011
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur système
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 63
    Points : 103
    Points
    103
    Par défaut
    Tous mes fichiers sont en UTF-8 et les langes disponibles pour ma session sont C, C.UTF-8, fr_FR.utf8, POSIX. L'encodage utilisé par mon éditeur est l'UTF-8. Donc en théorie l'UTF-8 étant disponible partout je ne devrais pas avoir de problème.

    Pour mon autre problème, il se trouve que dans mon tableau "@k" se trouve une ligne vide donc je suppose que c'est elle qui pose problème. Je vais essayer de la supprimer.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     marchiennes
     aotoiles
     oay
     lanianres
     traoteaux
     daoroulait
     nouao
     allongao
     tandis
     tantayt
     cheminaoe
     pavao
     aolevait
     braylaient
     dex
     taote
     petito
     braylant
     silouette
     aotait
     noyaoe
     aopaisseur
     idaoe
     haosita
     obscuritao
     enfonaiait
     gayte
     comprayt
     avanaiait
     fenaotres
     surmontao
     maome
     kilomantres
     arraoter
     taonanbres
     gaonait
     fumaoe
     aotaient
     aperaiut
     aocrasao
     montsou
     glacaoes
     balayao
     jetaoe
     serait
     aochappement
     encrassaoes
     aa
     ferraoe
     qu
     raosister
     prans
     
     aprans
    Voila à quoi ressemble mon tableau "@k" et il y a dans ce tableau deux lignes vides que je doit enlever mais je ne trouve pas de solutions.

  10. #10
    Membre actif

    Profil pro
    Inscrit en
    Août 2009
    Messages
    156
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 156
    Points : 211
    Points
    211
    Par défaut
    Ajoute un test sur la définition de ta variable :
    http://perl.developpez.com/faq/perl/...nB2#sectionB26

    Un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (defined($ligne) and $element=/\b$ligne\w\w\b/) {
    Pour l'UTF8 je sèche, si ta session est en UTF8 fr, et que ton fichier avec les mots est aussi en UTF8, ça devrait marcher ...

Discussions similaires

  1. Réponses: 5
    Dernier message: 20/10/2013, 03h09
  2. Réponses: 5
    Dernier message: 12/06/2012, 03h24
  3. Réponses: 17
    Dernier message: 09/02/2010, 16h22
  4. commande find: trouver les fichiers qui contiennent une chaine de caractère
    Par hammag dans le forum Administration système
    Réponses: 3
    Dernier message: 18/05/2008, 13h19
  5. Ou trouver les informations qui defile lors du boot ?
    Par piff62 dans le forum Administration système
    Réponses: 2
    Dernier message: 17/03/2005, 17h19

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