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] hash et fonction


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 69
    Par défaut [langage] hash et fonction
    salut,

    j'ai un hash qui possède une clé de type :
    gi|19612490|gb|AAH49588.1|__116
    gi|19612490|gb|AAH49588.1|__115
    gi|19612490|gb|AAH49588.1|__114
    gi|19612490|gb|AAH49588.1|__113
    gi|19612490|gb|AAH49588.1|__112
    gi|19612490|gb|AAH49588.1|__111
    gi|19612490|gb|AAH49588.1|__110
    gi|19612490|gb|AAH49588.1|__11
    hi|19612490|gb|AAH49588.1|__109
    hi|19612490|gb|AAH49588.1|__108
    hi|19612490|gb|AAH49588.1|__107
    hi|19612490|gb|AAH49588.1|__106
    hi|19612490|gb|AAH49588.1|__105
    cette clé est en fait composé de 2 éléments:

    gi|19612490|gb|AAH49588.1| et __11
    et j'aimerai pouvoir trier ce hash , d'abord par ordre alphabétique pour le 1er élément puis par ordre numérique pour le 2ème élément

    Pour cela, je dois utiliser la fonction ( je sais que ca marche avec!)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    sub byseq {
      my ($a1,$a2) = split /___/,$a; ## split permet de separer avant ($a1) et apres ($a2) __ de $a, $a etant la cle du hash
      my ($b1,$b2) = split /___/,$b; ## split permet de separer avant ($b1) et apres ($b2) __ de $b, $b etant la cle du hash
     
      if ($a1 ne $b1) { return ($a1 cmp $b1); }
      return ($a2-$b2);
    }
    en fait cette fonction permet de à partir des deux clés:

    gi|19612490|gb|AAH49588.1|__11
    hi|19612490|gb|AAH49588.1|__109

    de séparer les deux éléments de la clé en $a1 pour gi|19612490|gb|AAH49588.1|, $a2 pour 11, $b1 pour hi|19612490|gb|AAH49588.1|, et $b2 pour 109

    puis on compare $a1 et $b1, puis $a2 et $b2

    mais je na sais pas comment appeler cette fonction.

    merci de votre aide

  2. #2
    Mr6
    Mr6 est déconnecté
    Membre émérite

    Homme Profil pro
    Inscrit en
    Septembre 2004
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2004
    Messages : 608
    Par défaut
    Slt !

    Appelle ta fonction comme ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    my $c = byseq($a,$b); # tu appelles ta fonction en passant a et b en param et tu récupères le résultat dans c
    et mets ca dans ton sub :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    sub byseq {
    my ($a,$b) = @_; # tu récupères les params passés à ta fonction via la variable courante
    ...

    @+
    Mr6

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 69
    Par défaut
    en fait, j'aimerai l'appeler au moment où je trie et affiche les clés de mon hash.
    c'est-à-dire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    foreach my $key (reverse sort {$a cmp $b} keys (%hash)) { 
    print "$key\t\t$hash{$key}\n"; 
    print F"$key\t\t$hash{$key}\n"; }
    et donc je ne sais pas à quel endroit du code ci-dessus, je dois appeler la fonction?

    merci

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Par défaut
    Facile, Perlaud, tu as déjà tout fait, il y juste à mettre en ordre de marche

    J'ai remis tes données dans un à moi hash, pour tester, j'utilise ta fonction, et elle remplace la comparaison dans le sort ...

    voila :

    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
     
    #!/usr/bin/perl
     
    use strict;
    use warnings;
     
    my %hash = ("gi|19612490|gb|AAH49588.1|__116" => "A",
                "gi|19612490|gb|AAH49588.1|__115" => "B",
                "gi|19612490|gb|AAH49588.1|__114" => "C",
                "gi|19612490|gb|AAH49588.1|__113" => "D",
                "gi|19612490|gb|AAH49588.1|__112" => "E",
                "gi|19612490|gb|AAH49588.1|__111" => "F",
                "gi|19612490|gb|AAH49588.1|__110" => "G",
                "gi|19612490|gb|AAH49588.1|__11" => "H",
                "hi|19612490|gb|AAH49588.1|__109" => "I",
                "hi|19612490|gb|AAH49588.1|__108" => "J",
                "hi|19612490|gb|AAH49588.1|__107" => "K",
                "hi|19612490|gb|AAH49588.1|__106" => "L",
                "hi|19612490|gb|AAH49588.1|__105" => "M");
     
     
    sub byseq {
      my ($a1,$a2) = split /___/,$a; ## split permet de separer avant ($a1) et apres ($a2) __ de $a, $a etant la cle du hash
      my ($b1,$b2) = split /___/,$b; ## split permet de separer avant ($b1) et apres ($b2) __ de $b, $b etant la cle du hash
     
      if ($a1 ne $b1) { return ($a1 cmp $b1); }
      return ($a2-$b2);
    } 	 
     
    for my $key (reverse (sort { byseq ($a, $b) } keys (%hash))) {
      print "$key\t\t$hash{$key}\n";	 
    }

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 69
    Par défaut
    Ok merci bcp en effet c'était simple, mais je n'y arrivais pas....sorry!

  6. #6
    Expert confirmé
    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
    Par défaut
    En réalité on peut même faire encore plus simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    for my $key (reverse (sort \&byseq keys (%hash))) {
      print "$key\t\t$hash{$key}\n";   
    }
    Car il n'est pas nécessaire de passer des arguments à byseq : $a et $b sont des variables globales qui sont automatiquement initialisées par sort.

    --
    Jedaï

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

Discussions similaires

  1. [langage] hash et tri
    Par perlaud dans le forum Langage
    Réponses: 4
    Dernier message: 20/09/2004, 16h17
  2. [langage] hash de hash
    Par Kinethe dans le forum Langage
    Réponses: 17
    Dernier message: 27/08/2004, 13h22
  3. [langage] problème avec fonction read
    Par domidum54 dans le forum Langage
    Réponses: 2
    Dernier message: 30/03/2004, 20h42
  4. [langage] Creer une fonction qui met en majuscule ?
    Par Cyber@l dans le forum Langage
    Réponses: 6
    Dernier message: 04/12/2003, 18h44
  5. [langage] hash
    Par giverny dans le forum Langage
    Réponses: 3
    Dernier message: 12/08/2003, 11h27

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