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 :

détecter si un élément existe dans un hash perl


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mars 2010
    Messages
    157
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 157
    Par défaut détecter si un élément existe dans un hash perl
    Bonjour

    On sait que pour voir si un élément existe dans un hash perl on utilise le code suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     if(exists $stops{ "$line" } ) {
     
    						 print   FIC2  "$line $j " ;
    						 print   FIC2  $stops{ "$line" } ;
    						;
    						 print   FIC2 "\n" ;
    else
    {
    }
     
                }
    le problème ici même si l'élément n'est pas présent dans le hahs, le programme va exécuter le if est affiché dans mon cas 16178 qui le nombre d'élement du hash
    comment faire pour n'afficher que les éléments présent

    Merci

  2. #2
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    ce n'est pas possible. Le code du if (les trois print ...) ne peut s'exécuter que s'il existe dans le hash %stops une entrée ayant la clef $line.

    Si ton code s'exécute alors que tu penses qu'il n'y a pas d'entrée pour $line, alors vérifie le contenu du hash et le contenu de la variable $line.

    Par ailleurs, le branch else ne servant à rien, il est inutile de la mettre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if (exists $stops{ "$line" }) {
        print   FIC2  "$line $j " ;
        print   FIC2  $stops{ "$line" } ;
        print   FIC2 "\n" ;
    }
    et je me demande à quoi sert la variable $j et ce qu'elle contient.

    Le problème est sans doute ailleurs dans le code.

  3. #3
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    Je pense aussi qu'il faudrait que tu montres le code autour de cet extrait...

  4. #4
    Membre confirmé
    Inscrit en
    Mars 2010
    Messages
    157
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 157
    Par défaut
    Bonjour

    je vous montre le code complet, il lit deux fichier ligne par ligne et il les compare

    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
    55
    56
    57
    58
    #!/usr/bin/perl
    use strict;
    use warnings;
     
    open( FIC,  $ARGV[0] );
    open( FICC, $ARGV[1] );
     
    print "choose the name of the file\n";
     
    chomp( my $fic2 = <STDIN> );
    open( FIC2, ">$fic2" );
    my $i=0;
    my $j=0;
    my $h=0;
    my @b=();
    my %stops;
    while (<FIC>)    #read each line into $_
    {
        # Remove newline from $_
        chomp;
        $_ =~ s/\s+$//;
        $stops{$_} = $i;    # add the line to
        $i++;
    }
     
    close FIC;
     
    while (<FICC>) {
        my $ligne = $_;
        $ligne =~ s/\s+$//;
        $b[$j] = lc($ligne);
     
        # $b contain the data
     
        $j++;
    }
     
    foreach my $che (@b) {
     
        chomp($che);
     
    	       if( $stops{ $che }  ) {
     
     
    						 print   FIC2  $stops{ $che } ;
    						 print   FIC2  " : " ;
    						 print   FIC2 $che ;
    						 print   FIC2 "\n" ;
     
                }
    			 else{ 
    			 }
     
     
     
     
     
    }
    Ici le else n'est jamais exécuté!
    Les deux fichiers en entrée contennent chacun un mot par ligne, ensuite une ligne composé par des espaces ensuite un mot ainsi de suite

    result

    much

    london

    only

    top

    early
    fichier n°2:
    passenger

    saving

    shareholder

    london

    glass

    early
    peut être ces lignes qui contiennent des esapaces affectent le résultats

  5. #5
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    Une différence entre tes deux lectures de fichier : la lecture du fichier qui sert à charger @b converti les chaines de texte en minuscule (fonction lc) alors que celle qui sert à charger %stops ne converti pas les chaines en minuscule. Je ne connais pas l'impact que cela peut avoir.

    Après, je ne comprends pas non plus pourquoi le texte du fichier qui sert à charger @b n'est pas chompé au moment où tu le lis et le met dans @b, mais plus tard au moment de tester $stops{ $che } (mais à priori, le problème de devrait pas venir de là).

    Pour bien faire et comprendre ce qui ne va pas, il faudrait aussi fournir un "jeu de test" (fichiers en entrée) histoire de pouvoir tester (ou debugger).

  6. #6
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    Par défaut
    Bonsoir,

    Le code mis ci-dessus ne me plait vraiment pas .
    La manière d'ouvrir les fichiers n'est pas bonne, la manière de récupérer les fichiers est pas top. Du peu de jeu de données que je vois, je suppose que chaque fichier contient une liste de mots. Si c'est le cas, l'algorithme peut être amélioré en utilisant un petit module Perl pour comparer deux tableaux.

    Merci de nous montrer un jeu de données afin que l'on te propose un code.

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

Discussions similaires

  1. détecter si une valeur existe dans un array
    Par cedrick21 dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 15/12/2010, 11h09
  2. Message si l'élément existe dans la table
    Par aymane19 dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 11/05/2008, 19h13
  3. Savoir si un élément existe dans un tableau
    Par peuf23 dans le forum Langage
    Réponses: 2
    Dernier message: 30/06/2006, 12h09

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