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 :

[langage] Comparaison de chaîne


Sujet :

Langage Perl

  1. #1
    Candidat au Club
    Inscrit en
    Décembre 2003
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 4
    Points : 2
    Points
    2
    Par défaut [langage] Comparaison de chaîne
    Bonjour,

    j'ai un petit problème apparament simple, mais j'vois pas où ça cloche: j'ai une liste de mot dans un fichier, un par ligne, et je cherche à comparer une chaîne de caractères donnée à chacun de ses mots, et qu'ill m'affiche un signal si une correspondance a lieu. J'ai fait de multiples tests avec ce code, mais aucun mot n'est reconnu:
    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
     
    sub compare {
        my $wrd=$_[0];
        my $line;
        open(FDD,"<dico") || die "opening failure";
        print("testing $wrd:\n");
        foreach $line (<FDD>){
    	chomp($line);
     
    	if ( $line eq $wrd){
    	    print ("-> $wrd OK !\n");
    	}
     
        }
        close FDD;
    }
    J'débute en Perl...dites moi si l'erreur est flagrante.. Merci

  2. #2
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 862
    Points : 4 835
    Points
    4 835
    Par défaut
    Essaies avec ce code :
    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
     
    sub compare { 
        my $wrd=@_[0]; 
        my $line; 
        open(FDD,"<dico") || die "opening failure"; 
        print("testing $wrd:\n"); 
        foreach $line (<FDD>){ 
       chomp($line); 
     
       if ( $line eq $wrd){ 
           print ("-> $wrd OK !\n"); 
       } 
     
        } 
        close FDD; 
    }
    J'ai pas testé mais c'est une mauvaise initialisation à mon avis

    @++

  3. #3
    Candidat au Club
    Inscrit en
    Décembre 2003
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    ça change rien, j'avais initialisé l'argument comme ça au début, et j'ai un avertissement:
    Scalar value @_[0] better written as $_[0] at code.pl line 142.
    j'ai donc préféré le $_ à @_...

    et le problème semble pas venir de l'initialisation de la variable à tester, mais plutôt du format de la ligne lue, car si je remplace $wrd par une chaîne dans le test du if, l'égalité des chaînes n'est pas reconnue...

    Merci quand même

  4. #4
    Candidat au Club
    Inscrit en
    Décembre 2003
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    ça marche! il suffisait de rajouter un chop()
    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
     
    sub compare {
        my $wrd=$_[0];
        my $line;
        open(FDD,"<dico") || die "opening failure";
        print("testing $wrd:\n");
        foreach $line (<FDD>){
       chomp($line);
     
       if ( $line eq $wrd){
           print ("-> $wrd OK !\n");
       }
     
        }
        close FDD;
    }

  5. #5
    Membre actif
    Avatar de Choupi
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 223
    Points : 235
    Points
    235
    Par défaut
    Moi je te conseille l'utilisation d'un hash à la place du tableau:

    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
    my %dico;
    my $refdico = \%dico;
    my $file = "dico";
     
    creationDico($refdico,$file);
    trouverMot($refdico,"chat");
     
    sub trouverMot(){
    	my($refdico,$mot) = @_;
    	if(exists ${$refdico}{$mot}){
    		print "le mot $mot est bien dans le dico";
    	}
    }
     
    sub creationDico(){
    	my($refdico,$file) = @_;
    	open(DICO,$file) || die "opening failure";
    	while(<DICO>){
    		chomp $_;
    		${$refdico}{$_} = 0;
    	}
    }
    Euh c'est pas propre car je passe des references (un entrainement ) mais au moins tu utilises exists et c'est plus performant si le dico est grand...

  6. #6
    Candidat au Club
    Inscrit en
    Décembre 2003
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    et c'est plus performant si le dico est grand...
    $ wc dico
    22740 23068 228244 dico

    23068 mots donc!

    c'est vrai que c'est un peu plus intelligent d'utiliser une table de hash, l'habitude du C... merci du conseil

  7. #7
    Membre actif
    Avatar de Choupi
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 223
    Points : 235
    Points
    235
    Par défaut
    Oui alors la n'hesite meme pas ! ... l'habitude du C en perturbe plus d'un au debut (je ne cite aucun gldavid en particulier )

  8. #8
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 862
    Points : 4 835
    Points
    4 835
    Par défaut
    Qui ça ? Moi ???

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

Discussions similaires

  1. [Choix de langages] Comparaison d'éléments et optimisation.
    Par Hargun dans le forum Langages de programmation
    Réponses: 2
    Dernier message: 23/03/2011, 11h53
  2. [langage] Comparaison de deux fichiers
    Par perlgirl dans le forum Langage
    Réponses: 4
    Dernier message: 04/05/2005, 16h05
  3. [langage] Comparaison de tableaux
    Par WetzlarMan dans le forum Langage
    Réponses: 2
    Dernier message: 22/04/2004, 14h08
  4. Réponses: 6
    Dernier message: 21/01/2004, 13h25
  5. [langage] Comparaison de fichiers
    Par Jibees dans le forum Langage
    Réponses: 3
    Dernier message: 23/04/2003, 16h27

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