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 :

Rechercher les element d'une liste dans une autre liste


Sujet :

Langage Perl

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 40
    Points : 22
    Points
    22
    Par défaut Rechercher les element d'une liste dans une autre liste
    Bonjour je débute en perl et j'aurais besoin de quelques conseils.

    Je souhaite comparer deux listes et conserver les elements de ma premiere liste a condition qu'ils soient présents dans la deuxieme.

    tout d'abord la forme du document que je dois traiter est la suivante
    mot : synonyme1, synonyme2, ...

    j'ai donc une premiere liste qui est composée de ma liste des synonymes
    je l'obtient en faisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ($mot, $syn)=spit( / : / , $_ );
    après je met en place mes boucles

    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
     
    open(DICO, $dico);
    while (<DICO>)
    foreach $VAR ($syn)
    {
         foreach $VAR1 ($liste2)
            {
            if($VAR1 eq $VAR)
             {
                push(@result, $VAR);
             }
       }
    }
     
    close (dico)
    Comme vous pouvez vous en doutez ca ne fonctionne pas aussi je ne vous demanderai pas de l'aide.

    J'ai fait quelquie test est je remarque que $VAR ne me renvoie pas la premiere valeur de ma liste mais la liste complete
    Alors que moi je souhaite tout d'abord regarder s'il la premiere valeur de ma liste syn appartient à la liste2 si c'est le cas j'ajoute a ma liste résultat sinon je passe au deuxieme element de ma liste syn.

    Je susi a l'écoute de tous les conseils et je pense qu'une optimisation sera possible en utilisant la fonction grepau lieu de la seconde boucle foreach mais on verra ca apres

  2. #2
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 581
    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 581
    Points : 2 029
    Points
    2 029
    Par défaut
    Hello,

    déjà y a un truc qui cloche (j'ai pas regardé plus en détail) mais la fonction pour spliter les données s'appelle split et non spit


  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 Re: Rechercher les element d'une liste dans une autre liste
    Bonjour,

    Citation Envoyé par fessebleu
    Je souhaite comparer deux listes et conserver les elements de ma premiere liste a condition qu'ils soient présents dans la deuxieme.

    tout d'abord la forme du document que je dois traiter est la suivante
    mot : synonyme1, synonyme2, ...

    j'ai donc une premiere liste qui est composée de ma liste des synonymes
    je l'obtient en faisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ($mot, $syn)=split( / : / , $_ );
    En faisant ainsi (à la correction de typo sur le split près), tu n'obtiens qu'une liste de deux éléments : $mot et $syn ... s'il y avait plus d'une fois " : " dans $_, tous les champs suivants sont négligés ... est-ce l'effet souhaité ?

    Citation Envoyé par fessebleu
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    open(DICO, $dico);
    while (<DICO>)
    foreach $VAR ($syn)
    {
         foreach $VAR1 ($liste2)
            {
            if($VAR1 eq $VAR)
             {
                push(@result, $VAR);
             }
       }
    }
     
    close (dico)
    euh ... $syn est un scalaire, pas une liste ... c'est donc un élément "unique". Un foreach sur un scalaire correspond au parcours d'une liste d'un seul élément.

    Même remarque pour $liste2 dans le deuxième foreach !

    De plus, dans ce que tu fournis comme exemple, tu ne te préoccupe jamais de ce qui est récupéré dans <DICO>

    Citation Envoyé par fessebleu
    J'ai fait quelquie test est je remarque que $VAR ne me renvoie pas la premiere valeur de ma liste mais la liste complete
    Alors que moi je souhaite tout d'abord regarder s'il la premiere valeur de ma liste syn appartient à la liste2 si c'est le cas j'ajoute a ma liste résultat sinon je passe au deuxieme element de ma liste syn.
    Es tu sûr de ton séparateur de champs, dans le split ? Il s'agit bien d'un ":" encadré d'un blanc de chaque côté ???

    Il te faut faire un peu plus attention au "type" des données que tu manipules. Une valeur isolée se range dans un "scalaire" (préfixé par un $) alors qu'une liste ou tableau (préfixé par un @) en contient plusieurs.

    Dans le cas qui t'intéresse, l'usage d'une table hachée (préfixée par un %) peut être d'un grand secours. En effet, dans un hash, les valeurs sont indexées par une chaine de caractère, ce qui facilite grandement les recherches et est très pratique pour constituer toutes sortes de "dictionnaires".

    Je t'invite à consulter, éventuellement, les articles à ce sujet dans la FAQ (lien dans ma signature, rubriques 3.2, 3.3 et 3.4) en espérant que tu y trouveras de quoi choisir les meilleures structures de données pour les traitements que tu souhaites réaliser.
    La FAQ Perl est par ici
    : La fonction "Rechercher", on aurait dû la nommer "Retrouver" - essayez et vous verrez pourquoi !

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 40
    Points : 22
    Points
    22
    Par défaut
    Bonjour à tous
    Tout d'abord je m'excuse de répondre si tard mais malheureusement j'ai du mettre de coté ce projet

    Merci à 2Eurocents pour tes conseils et en lisant les faq j'ai changer de méthodes

    mon fichier de départ est de la forme suivante :

    se conformer:observer,respecter,suivre,tenir
    se maintenir:pers��er,tenir
    soutenir:continuer,d�endre,maintenir,pers��er,suivre,supporter,tenir
    suivre:accomplir,continuer,observer,respecter,se conformer,soutenir,tenir
    supporter:maintenir,soutenir,tenir
    tenir:accomplir,arr�er,conserver,continuer,d�endre,ex�uter,faire,garder,maintenir,manier,observer,occuper,pers��er,respecter,retenir,satisfaire,se conformer,se maintenir,soutenir,suivre,supporter

    Pour obtenir un minidictionnaire, je définie une vedette principale. je regarde les synonymes de ma vedette . Puis je dois les comparer avec les autres synonymes des autres vedettes.

    Si "tenir" est ma vedette principale , je dois comparer ses synonymes avec ceux des autres vedettes (dans l'exemple de dico audessus, je dois donc comparer avec satisfaire, se conformer, se maintenir, ..., supporter)
    Je ne conserve que les synonymes qui sont identiques à ceux de tenir. J'obtiens donc un nouveau dico appelé minidico.
    J'ai donc utilisé les tables de hachage (s'il quelqu'un a une autres solutions je suis preneur), mais un petitprobleme apparait
    des synonymes apparaissent en double

    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
     
     #!/usr/bin/perl
     $dicopath=".";
     $dico="$dicopath/";
     $dico.="$ARGV[0]";
     $vedetteprincipalepath=".";
     $vedetteprincipale.="$ARGV[1]";
     $syn=$ARGV[2];
     
     print ("$vedetteprincipale\n");
     #ouverture du dictionnaire
     open(DICO, $dico);
     #on récupére la liste des synonyme de la vedette principale que l'on met dans un tableau
     #@synvedetteprinci=();
     while (<DICO>)
     {
         ($vedette,$synons)=split(/:/,$_);
         if(($vedette) eq ($vedetteprincipale))
         {
         @synvedetteprinci =  split(/,/,$synons);
         }
     }
     print("je lis le fichier "); 
     print "$dico";
     print("========================================================================================\n");
     close(DICO);
     
     #on compare les synomnyme de chaque vedette avec le résultat des synonyme de la vedette principal
     #S'il le synonyme apparait dana la liste on le conserve sinon on continue
     #on construit ainsi le nouveau minidico
     open(DICO, $dico);
     while (<DICO>)
     {
     #création de la table de hachage
        ($vedette,$syno)=split(/:/,$_);
         %tmp_vs=($vedette,$syno);
         %ved_syn=(%ved_syn,%tmp_vs);
     } 
      while (($local_ved,$local_syno) = each %ved_syn)
     {
         @local_syno2=split(/,/,$local_syno);
         print("%s \n Vedette : $local_ved \n Synonymes: \n");
         foreach $synotmp (@local_syno2){
         foreach $synvedette (@synvedetteprinci){
            if($synvedette =~ $synotmp){
                      #on regarde s'il le synonyme "synotmp" appartient au  synonyme de ma vedette principale 
                print (" \t $synotmp \n");
            }
            }
         }
     }
     close(DICO);
     
     #on enregistre le résultat dfans le fichier
     open(SYN,">$syn");
     print(SYN @synreduit);
     close(SYN);
    voici un copier coller de mon résultat

    tenir
    je lis le fichier ./minidico2_tenir.txt========================================================================================
    %s
    Vedette : se maintenir
    Synonymes:
    pers��er
    %s
    Vedette : satisfaire
    Synonymes:
    accomplir
    ex�uter
    faire
    faire
    observer
    respecter
    %s
    Vedette : soutenir
    Synonymes:
    continuer
    d�endre
    maintenir
    maintenir
    pers��er
    suivre
    supporter
    %s
    Vedette : supporter
    Synonymes:
    maintenir
    maintenir //NE DEVREZ PAS REAPPAITRE UNE DEUXIEME FOIS
    soutenir
    %s
    Vedette :

    Synonymes:
    %s
    Vedette : suivre
    Synonymes:
    accomplir
    continuer
    observer
    respecter
    se conformer
    soutenir
    %s
    Vedette : se conformer
    Synonymes:
    observer
    respecter
    suivre
    %s
    Vedette : tenir
    Synonymes:
    accomplir
    arr�er
    conserver
    continuer
    d�endre
    ex�uter
    faire
    faire
    garder
    maintenir
    maintenir
    manier
    observer
    occuper
    pers��er
    respecter
    retenir
    satisfaire
    se conformer
    se maintenir
    soutenir
    suivre
    supporter

    J'ai un autre petit souci qui est pour la reconstruction de mon fichier. Au départ, je voulais réutilisais les table de hachage

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        foreach $synvedette (@synvedetteprinci){
            if($synvedette =~ $synotmp){
                      #on regarde s'il le synonyme "synotmp" appartient au  synonyme de ma vedette principale 
                print (" \t $synotmp \n");
            }
    A ce moment la, je voulais recré une table de hachage pour y mettre le synonyme est conserver la vedette. En faisant les essais j'ai remarqué que puisque la clés ne change pas, la valeur insérer écrasait l'ancienne. Mais moi je souhaite les conserver. Est ce qu'il existe un moyen de d'obtenir avec une table de hachage plusieur valeur pour une seule clé

    Merci d'avance pour vos conseil
    Amicalement Fessebleu

  5. #5
    Membre chevronné
    Avatar de Woufeil
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 1 076
    Points : 2 004
    Points
    2 004
    Par défaut
    Est ce qu'il existe un moyen de d'obtenir avec une table de hachage plusieur valeur pour une seule clé
    Et bien oui et non
    Une clé de table de hachage ne peut être associé qu'à une seule valeur, mais cette valeur peut en représenter plusieurs. Cela se fait avec les références : si l'u des éléments de ta table de hachage est une référence, tu peux faire en sorte que cette référence soit une référence vers un tableau ou un autre table de hachage, dans ce cas elle représentera plusieurs valeurs au choix. Un exemple sera plus parlant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    my $ref = {"cle1" => "ele1",
                "cle2" => "ele2"};
     
    my %h = ("cle3" => "ele3",
            "cle4" => $ref);
     
    print $h{cle4}->{cle1}; #affiche ele1
    Cela te convient-il ?
    "En essayant continuellement, on finit par réussir. Donc : plus ça rate, plus on a de chances que ça marche" (devise Shadock)
    Application :

    ainsi qu'à regarder la avant de poser une question.

    La rubrique Perl recrute, contactez-moi.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 40
    Points : 22
    Points
    22
    Par défaut
    je vais regarder de plus pres ce que tu viens d'écrire.
    Mais pour l'instant j'ai contourné le probleme avec des listes
    mais merci de ta réponse

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 172
    Points : 208
    Points
    208
    Par défaut
    Salut,

    Personnellement je pense qu'il y a toujours des confusions concernant la terminologie.

    Dans le livre de Larry Wall, Programmation en Perl, il parle de Hachage de tableaux, Tableaux des hachage, Tableaux de tableaux et Hachages de hachages.

    Table de hachage????

    Donc dans ton cas je crois que tu parles d'un Hachage de tableaux.
    Donc une cle à comme valeur une référence à un tableau anonyme.

    Voilà une répresentation
    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
    #! /usr/bin/perl 
     
    use warnings; 
    use strict; 
     
    # Hachage de tableaux 
    my %HdT = ( 
           cle1 => [ "a", "b", "c" ], 
           cle2 => [ "aa", "bb", "cc" ], 
           cle3 => [ "aaa", "bbb", "ccc"], 
    ); 
    # Manipulation des Hachages de tableaux 
     
    foreach (sort keys %HdT) { 
     print "$_ => @{$HdT{$_}}\n"; 
    } 
    print "\n"; 
    # Ajoute de la cle4 avec ses éléments 
    push @{$HdT{cle4}}, 1..4; 
     
    # affichage
    foreach my $cle ( sort keys %HdT) { 
     print "$cle : "; 
       foreach my $i (0..$#{$HdT{$cle}}){ 
         print " t[$i] = $HdT{$cle}[$i] "; 
       } 
     print "\n"; 
    }
    Ca ne me dérange pas la terminologie, mais on commence à parer de hachage de tableaux et on fini avec table de hachage.

    A toi de voir.

    lami20j

    P.S. Il faut lire et comprendre les références.
    --
    lami20j

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 172
    Points : 208
    Points
    208
    Par défaut
    Bizarre,

    j'ai modifé mon message et je l'ai eu en double. Désolé.
    Peut être une mauvaise manip de ma part.

    lami20j
    --
    lami20j

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 172
    Points : 208
    Points
    208
    Par défaut
    Salut,

    Personnellement je pense qu'il y a toujours des confusions concernant la terminologie.

    Dans le livre de Larry Wall, Programmation en Perl, il parle de Hachage de tableaux, Tableaux des hachage, Tableaux de tableaux et Hachages de hachages.

    Table de hachage????

    Donc dans ton cas je crois que tu parles d'un Hachage de tableaux.
    Donc une cle à comme valeur une référence à un tableau anonyme.
    Donc plusieurs valeurs pour une seule clé.

    Voilà une répresentation
    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
    #! /usr/bin/perl 
     
    use warnings; 
    use strict; 
     
    # Hachage de tableaux 
    my %HdT = ( 
           cle1 => [ "a", "b", "c" ], 
           cle2 => [ "aa", "bb", "cc" ], 
           cle3 => [ "aaa", "bbb", "ccc"], 
    ); 
    # Manipulation des Hachages de tableaux 
     
    foreach (sort keys %HdT) { 
     print "$_ => @{$HdT{$_}}\n"; 
    } 
    print "\n"; 
    # Ajoute de la cle4 avec ses éléments 
    push @{$HdT{cle4}}, 1..4; 
     
    # affichage
    foreach my $cle ( sort keys %HdT) { 
     print "$cle : "; 
       foreach my $i (0..$#{$HdT{$cle}}){ 
         print " t[$i] = $HdT{$cle}[$i] "; 
       } 
     print "\n"; 
    }
    Ca ne me dérange pas la terminologie, mais on commence à parer de hachage de tableaux et on fini avec table de hachage.

    A toi de voir.

    lami20j

    P.S. Il faut lire et comprendre les références.
    --
    lami20j

  10. #10
    Membre chevronné
    Avatar de Woufeil
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 1 076
    Points : 2 004
    Points
    2 004
    Par défaut
    Une table de hachage est une table qui associe à une clé une valeur, un tableaux de hachages est un tableau dont certains éléments dont des références vers des tables de hachages, un hachage de tableaux est un hachage dont certaines valeurs sont des tableaux, un tableau de tableau est un tableau dont certains éléments sont des tableaux et un hachage de hachage est une table de hachage dont certains éléments sont des tables de hachages.

    Pour le vocabulaire
    "En essayant continuellement, on finit par réussir. Donc : plus ça rate, plus on a de chances que ça marche" (devise Shadock)
    Application :

    ainsi qu'à regarder la avant de poser une question.

    La rubrique Perl recrute, contactez-moi.

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 40
    Points : 22
    Points
    22
    Par défaut
    je viens de trouver la premiere erreur de mon programme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        if($synvedette =~ $synotmp){
    il faut que je vérifie mais je pense =~ regarde si une chaine de caracteres est dans une autre tandis que moi je veux que les deuc chianes soient totalement identiques dons j'ai remplacé par EQ et je n'ai plus mes doublons dansmon affichages

    Je regarderais demain pour le tableau de hachage, mais de ce que je viens de voir sur les exemples que tu as fourni , correspond a ce que je veux faire.
    Mais la je suis un peu trop fatiguer et je vous tiens au courant demain
    Bonne soirée à tous le monde

  12. #12
    Membre chevronné
    Avatar de Woufeil
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 1 076
    Points : 2 004
    Points
    2 004
    Par défaut
    En effet, l'opérateur =~ dit bind signifie "ressemble à", et non "est égal à", il sert pour les regex. Plus de détail dans la FAQ
    "En essayant continuellement, on finit par réussir. Donc : plus ça rate, plus on a de chances que ça marche" (devise Shadock)
    Application :

    ainsi qu'à regarder la avant de poser une question.

    La rubrique Perl recrute, contactez-moi.

  13. #13
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 172
    Points : 208
    Points
    208
    Par défaut
    Salut

    Citation Envoyé par Woufeil
    Une table de hachage est une table qui associe à une clé une valeur, un tableaux de hachages est un tableau dont certains éléments dont des références vers des tables de hachages, un hachage de tableaux est un hachage dont certaines valeurs sont des tableaux, un tableau de tableau est un tableau dont certains éléments sont des tableaux et un hachage de hachage est une table de hachage dont certains éléments sont des tables de hachages.

    Pour le vocabulaire
    En bref, table de hachage = hachage tout court

    Je cite depuis Introduction à Perl par Randal L. Schwartz (Chap 5 - Hachages - Note de bas de page)

    " Jadis, nous les appelions - tableaux associatifs - . Mais la communauté Perl a troué, vers 1995, que cela représentait tropt des lettres à saisir et de syllabes à prononcer, et l'a remplacé par - hachages "

    C'est bizarre quand même. On dit tout simplement tableau et pas table de tableau.

    Merci,

    lami20j
    --
    lami20j

  14. #14
    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
    C'est probablement parce qu'un "hachage" est en fait un tableau, qui contient des éléments dont on détermine l'index par une technique appelé "hachage" de la clé. En fait appeler cette structure "hachage" c'est utiliser une métonymie, alors que table de hachages serait une appellation plus correcte (tableaux associatif serait sûrement encore mieux).

    --
    Jedaï

  15. #15
    Membre chevronné
    Avatar de Woufeil
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 1 076
    Points : 2 004
    Points
    2 004
    Par défaut
    Tout à fait, hachage est un raccourci de table de hachage et non l'appellation correcte. En anglais, on dit d'ailleurs une hashtable, et ce mot est souvent abrégé en hash
    Mais c'es vrai que tableau associatif c'est super long à écrire : n'oubliez pas les qualités d'un programmeur Perl : l'orgeuil, l'impatience, et... la paresse
    "En essayant continuellement, on finit par réussir. Donc : plus ça rate, plus on a de chances que ça marche" (devise Shadock)
    Application :

    ainsi qu'à regarder la avant de poser une question.

    La rubrique Perl recrute, contactez-moi.

  16. #16
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 172
    Points : 208
    Points
    208
    Par défaut
    Salut
    Citation Envoyé par Woufeil
    Tout à fait, hachage est un raccourci de table de hachage et non l'appellation correcte. En anglais, on dit d'ailleurs une hashtable, et ce mot est souvent abrégé en hash
    J'aime ça mais regarde ici

    Salut,

    Citation:
    Jedai a écrit :
    en utilisant une table de hachage.



    Je reviens sur le sujet de la terminologie. Je parle de "table de hachage"
    Je cite depuis le livre Perl CookBook - Chapitre 5 Hashes (Hachages) Citation:
    Other languages that support similar constructs sometimes use different terms for them; you may hear about hash tables, tables, dictionaries, mappings, or even alists, depending on the language

    et depuis Perl en action Citation:
    D'autre langages propose des constructeurs semblebles et utilisent parfois des noms différents pour les désigner: on attend parler de table de hachage........
    lami20j
    --
    lami20j

  17. #17
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 172
    Points : 208
    Points
    208
    Par défaut
    Salut fessebleu,

    je crois que maintenir sort deux fois à cause de l'existence aussi de se maintenir.
    A vrai dire je n'ai pas trop décortiqué ton code.
    J'ai fait une autre approche concernant ton traitement et d'après le résultat j'ai tiré cette conclusion.
    Peut être je n'ai par raison.

    Voilà mon script (j'ai utilisé ta liste des verbes et j'ai ajouté de choses bidon pour tester).

    Le fichier dico.txt sur le quel j'ai travaillé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    satisfaire:accomplir,exécuter,faire,observer,respecter,tenir
    se conformer:observer,respecter,suivre,tenir
    se maintenir:persister,tenir
    soutenir:continuer,défendre,maintenir,persister,suivre,supporter,tenir
    suivre:accomplir,continuer,observer,respecter,se conformer,soutenir,tenir
    supporter:maintenir,soutenir,tenir
    tenir:accomplir,arrêter,conserver,continuer,défendre,exécuter,faire,garder,maintenir,manier,observer,occuper,persister,respecter,retenir,satisfaire,se conformer,se maintenir,soutenir,suivre,supporter
    aa:gg,fd,dssd,dfsd,dsf,tt
    bb:dsf,fd,gg,rrr
    Le script
    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
    #! /usr/bin/perl
     
    use warnings;
    use strict;
     
     
    my %total_verbe;
    my %result_verbe;
    my @affiche;
     
    # ouvrir handle vers.* dico.txt
     
    open DICO,"dico.txt" or die "E/S : $!\n";
     
    # récuperation des données
     
    while (<DICO>) {
      my ($verbe,$liste_synonyme) = split /:/,$_,2;
      push @{$total_verbe{$verbe}}, split /,/,$liste_synonyme ;
    }
     
    # la vedette principale (ton cas tenir)
     
    print "Entrez le verbe vedette principale : " and chomp(my $vedette_p =<STDIN>);
     
    # récuperation des verbes qu'ont parmi les synonymes la vedette principale
    # ton cas : satisfaire, se conformer........,supporter
     
    foreach (keys %total_verbe) {
      if( grep { /$vedette_p/ } @{$total_verbe{$_}} ) {
        push @{$result_verbe{$_}}, @{$total_verbe{$_}};
      }
    }
    # affichage des verbes qu'ont comme synonyme le verbe vedette principale (tenir)
     
    print "Verbes qu'ont comme synonyme la vedtte principalle $vedette_p :\n";
    foreach (sort keys %result_verbe) {
      print "$_\n";
    }
     
    # le verbe à afficher à la demande
    print "Entre le verbe à consulter : " and chomp(my $v =<STDIN>);
     
    foreach my $vv ( @{$result_verbe{$v}} ) {
      push  @affiche, grep { /$vv/ } @{$total_verbe{$vedette_p}};
    }
     
    {
      local $"="\n";
      print "$v : \n@affiche\n";
    }
    Le résultat
    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
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    lami20j@debian:~/bin/my_deb_perl$ perl dico_hardware.pl
    Entrez le verbe vedette principale : tenir
    Verbes qu'ont comme synonyme la vedtte principalle tenir :
    satisfaire
    se conformer
    se maintenir
    soutenir
    suivre
    supporter
    tenir
    Entre le verbe à consulter : supporter
    supporter :
    maintenir
    se maintenir
    soutenir
    lami20j@debian:~/bin/my_deb_perl$ perl dico_hardware.pl
    Entrez le verbe vedette principale : tenir
    Verbes qu'ont comme synonyme la vedtte principalle tenir :
    satisfaire
    se conformer
    se maintenir
    soutenir
    suivre
    supporter
    tenir
    Entre le verbe à consulter : se maintenir
    se maintenir :
    persister
    lami20j@debian:~/bin/my_deb_perl$ perl dico_hardware.pl
    Entrez le verbe vedette principale : tenir
    Verbes qu'ont comme synonyme la vedtte principalle tenir :
    satisfaire
    se conformer
    se maintenir
    soutenir
    suivre
    supporter
    tenir
    Entre le verbe à consulter : soutenir
    soutenir :
    continuer
    défendre
    maintenir
    se maintenir
    persister
    suivre
    supporter
     
    lami20j@debian:~/bin/my_deb_perl$ perl dico_hardware.pl
    Entrez le verbe vedette principale : gg
    Verbes qu'ont comme synonyme la vedtte principalle gg :
    aa
    bb
    Entre le verbe à consulter : aa
    aa :
    dssd
    dsf
    tt
     
    lami20j@debian:~/bin/my_deb_perl$ perl dico_hardware.pl
    Entrez le verbe vedette principale : gg
    Verbes qu'ont comme synonyme la vedtte principalle gg :
    aa
    bb
    Entre le verbe à consulter : bb
    bb :
    dsf
    lami20j@debian:~/bin/my_deb_perl$
    Je n'ai pas traité l'écriture de résultat dans un autre fichier.

    lami20j
    --
    lami20j

  18. #18
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 172
    Points : 208
    Points
    208
    Par défaut
    Re,

    Citation Envoyé par Woufeil
    Tout à fait, hachage est un raccourci de table de hachage et non l'appellation correcte. En anglais, on dit d'ailleurs une hashtable, et ce mot est souvent abrégé en hash
    Je ne suis pas méchant mais regarde comme Larry a intitulé le chapitre concernant "l'appelation correcte"
    http://safari.oreilly.com/JVXSL.asp?...3-CHP-2-SECT-9

    lami20j
    --
    lami20j

  19. #19
    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
    Citation Envoyé par lami20j
    Re,
    Je ne suis pas méchant mais regarde comme Larry a intitulé le chapitre concernant "l'appelation correcte"
    http://safari.oreilly.com/JVXSL.asp?...3-CHP-2-SECT-9

    lami20j
    Oui et comme chacun sait Larry est un adepte des trois vertus du programmeur : hubris, impatience et paresse...
    L'appellation "correcte" de ce type de structure (indépendamment du langage) est probablement tableau associatif (car elle décrit la fonction de la structure), un peu moins correcte table de hachage (car elle décrit l'implémentation de la structure), ensuite on tombe dans la métonymie : hachage.
    Larry ne fait pas de débat sur l'appellation correcte de la structure, il emploie le terme le plus courant dans la communauté Perl pour en parler, et cette appellation ne s'est pas imposé parce qu'elle était correcte, mais parce qu'elle était courte.
    Notons d'ailleurs que l'appellation française hachage est plus longue que l'anglaise hash, comme par ailleurs je trouve hachage assez laid, j'ai tendance à utiliser plutôt le terme hash (je suis certain que des vertus du programmeur j'ai au moins retenu la paresse ).

    NB : Tu sembles avoir mal compris mon intervention, je ne cherchais pas à te corriger ou à t'inciter à utiliser table de hachage, je t'expliquais simplement pourquoi on employait ce terme parce que tu semblais t'interroger.

    --
    Jedaï

  20. #20
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 172
    Points : 208
    Points
    208
    Par défaut
    Re,
    Citation Envoyé par Jedai
    NB : Tu sembles avoir mal compris mon intervention, je ne cherchais pas à te corriger ou à t'inciter à utiliser table de hachage, je t'expliquais simplement pourquoi on employait ce terme parce que tu semblais t'interroger.
    D'accord, d'accord

    Merci maître /Jeda?i/
    lami20j

    P.S. Je me suis interrogé puisque (malheureusement je ne me rappelle pas où )
    j'ai rencontré l'utilisation de table de hachage pour un hachage de tableau ce qui me semblais bizarre.
    --
    lami20j

Discussions similaires

  1. [Toutes versions] coller les données d'une plage d'une cellule dans une cellule d'une autre feuille[VBA]
    Par arthson dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 24/01/2012, 17h37
  2. portée d'une variable dans une fonction dans une méthode
    Par laurentg2003 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 29/06/2009, 19h05
  3. [POO] dans une classe, appeler une fonction dans une méthode
    Par arnaudperfect dans le forum Langage
    Réponses: 3
    Dernier message: 26/08/2007, 23h04
  4. Envoyer une formulaire dans une page dans une Frame
    Par zooffy dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 29/06/2007, 10h13
  5. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/06/2007, 13h48

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