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 :

remplissage de table de hachage à partir de texte


Sujet :

Langage Perl

  1. #1
    Débutant Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Points : 117
    Points
    117
    Par défaut remplissage de table de hachage à partir de texte
    Bonjour à tous,
    Je cherche comment faire pour remplir une table de hachahe d'elements extraints à partir d'un texte
    voilà mon petit bout de code qui cré une table de hachage en l'initialisant, et qui extrait les element du texte à stocker dans la table de hachage
    Merci pour votres aide
    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
    #!/usr/bin/perl 
    use strict;
    use warnings;
    my %h = ();
    my $InFile = "/home/cyrine/restri";
    open my $fh_infile, '<', $InFile or die "Can't open $InFile\n";
     
    while ( my $Ligne = <$fh_infile> ) {
      if ( $Ligne =~ /^(.*?)\->/ ) {
        # traiter $substring
        print $1; 
        # inserer le contenu de $1 dans la table de hachage
     
      }     
    }
    close $fh_infile;
    Le jour est le père du labeur et la nuit est la mère des pensées.

  2. #2
    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 : 58
    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
    Points : 5 753
    Points
    5 753
    Par défaut
    Je suppose que tu souhaites utiliser comme clé de hachage, ce qui se trouve à gauche du texte ->, et comme valeur, ce qui se trouve à droite ?

    Voici ce qu'il faudrait écrire dans ce cas:
    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
    #!/usr/bin/perl 
    use strict;
    use warnings;
    use feature qw(:5.10);
     
    my %h = ();
    my $InFile = "/home/cyrine/restri";
    open my $fh_infile, '<', $InFile or die "Can't open $InFile\n";
     
    while ( my $Ligne = <$fh_infile> ) {
      if ( $Ligne =~ /->/ ) {
        my ($cle, $valeur) = split /->/, $Ligne;
        # traiter $substring
        say $cle; 
        # inserer le contenu de $1 dans la table de hachage
        $h{$cle}  = $valeur;
      }     
    }
    close $fh_infile;
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  3. #3
    Débutant Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Points : 117
    Points
    117
    Par défaut
    Citation Envoyé par Philou67430 Voir le message
    Je suppose que tu souhaites utiliser comme clé de hachage, ce qui se trouve à gauche du texte ->, et comme valeur, ce qui se trouve à droite ?

    Voici ce qu'il faudrait écrire dans ce cas:
    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
    #!/usr/bin/perl 
    use strict;
    use warnings;
    use feature qw(:5.10);
     
    my %h = ();
    my $InFile = "/home/cyrine/restri";
    open my $fh_infile, '<', $InFile or die "Can't open $InFile\n";
     
    while ( my $Ligne = <$fh_infile> ) {
      if ( $Ligne =~ /->/ ) {
        my ($cle, $valeur) = split /->/, $Ligne;
        # traiter $substring
        say $cle; 
        # inserer le contenu de $1 dans la table de hachage
        $h{$cle}  = $valeur;
      }     
    }
    close $fh_infile;

    Merci Philou por votre reponse,
    En fait oui vous avez raison
    j'ai des lignes de cette forme :
    de+l -> with (0.008726)
    je veux que la clé soit ce qui à gauche de "(" et la valeur c'set " (0.008726)"
    Donc je pense que je dois changer cette ligne de code comme ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     if ( $Ligne =~ /^(.*?)\(/ ) {
    merci:
    Le jour est le père du labeur et la nuit est la mère des pensées.

  4. #4
    Débutant Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Points : 117
    Points
    117
    Par défaut
    je pense aussi qu'il faut changer cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      my ($cle, $valeur) = split /->/, $Ligne;
    mais comment faire?
    thnks
    Le jour est le père du labeur et la nuit est la mère des pensées.

  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 : 58
    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
    Points : 5 753
    Points
    5 753
    Par défaut
    Peut-être comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my ($cle, $valeur) = $Ligne = /(.*)\s*\(.*?)\)/;
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  6. #6
    Débutant Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Points : 117
    Points
    117
    Par défaut
    Citation Envoyé par Philou67430 Voir le message
    Peut-être comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my ($cle, $valeur) = $Ligne = /(.*)\s*\(.*?)\)/;
    Il m'affiche une erreur de compilation : "Unmatched ) in regex; marked by <-- HERE in m/) <-- HERE / at ./perl.pl"
    Le jour est le père du labeur et la nuit est la mère des pensées.

  7. #7
    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 : 58
    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
    Points : 5 753
    Points
    5 753
    Par défaut
    Il faut corriger ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my ($cle, $valeur) = $Ligne = /(.*)\s*\((.*?)\)/;
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  8. #8
    Débutant Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Points : 117
    Points
    117
    Par défaut
    Citation Envoyé par Philou67430 Voir le message
    Il faut corriger ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my ($cle, $valeur) = $Ligne = /(.*)\s*\((.*?)\)/;
    MErci philou pour votre reponse,
    Mais ca ne marche pas
    il m'affiche une liste de message d'erreur de ce type:
    Use of uninitialized value $_ in pattern match (m//) at ./perl.pl line 12, <$fh_infile> line 18655.

    Use of uninitialized value $_ in pattern match (m//) at ./perl.pl line 12, <$fh_infile> line 18656.

    Use of uninitialized value $_ in pattern match (m//) at ./perl.pl line 12, <$fh_infile> line 18657.

    Use of uninitialized value $_ in pattern match (m//) at ./perl.pl line 12, <$fh_infile> line 18658.

    Use of uninitialized value $_ in pattern match (m//) at ./perl.pl line 12, <$fh_infile> line 18659.

    Le jour est le père du labeur et la nuit est la mère des pensées.

  9. #9
    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 : 58
    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
    Points : 5 753
    Points
    5 753
    Par défaut
    Montrez le script en totalité, et indiqué la correspondance du numéro de ligne dans le listing du forum.
    Difficile de tester directement avec vos données, vu qu'on ne dispose pas du fichier d'entrée.
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  10. #10
    Débutant Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Points : 117
    Points
    117
    Par défaut
    d'accord,
    voilà mon 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
    #!/usr/bin/perl 
    use strict;
    use warnings;
    use feature qw(:5.10);
     
    my %h = ();
    my $InFile = "/home/cyrine/restri";
    open my $fh_infile, '<', $InFile or die "Can't open $InFile\n";
     
    while ( my $Ligne = <$fh_infile> ) {
      if ( $Ligne =~ /^(.*?)\(/ ) {
        my ($cle, $valeur) = $Ligne = /(.*)\s*\((.*?)\)/;
        # traiter $substring
        say $cle; 
        # inserer le contenu de $1 dans la table de hachage
        $h{$cle}  = $valeur;
     
      }     
    }
    close $fh_infile;
    et ceci un bout du fichier à traiter :
    de+la -> community (0.011004)
    de+la -> from (0.010509)
    de+la -> is (0.009266)
    de+la -> at (0.007937)
    de+l -> of (0.041892)
    de+l -> the (0.026769)
    de+l -> and (0.026017)
    de+l -> in (0.023007)
    de+l -> to (0.016162)
    de+l -> eu (0.015325)
    de+l -> for (0.013790)
    Merci
    Le jour est le père du labeur et la nuit est la mère des pensées.

  11. #11
    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 : 58
    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
    Points : 5 753
    Points
    5 753
    Par défaut
    Erreur grossière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my ($cle, $valeur) = $Ligne =~ /(.*)\s*\((.*?)\)/;
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  12. #12
    Débutant Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Points : 117
    Points
    117
    Par défaut
    Merci Philou
    Le jour est le père du labeur et la nuit est la mère des pensées.

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 28/06/2015, 14h16
  2. Réponses: 15
    Dernier message: 10/01/2010, 18h17
  3. créer un tableau à partir d'une table de hachage
    Par étoile de mer dans le forum Débuter
    Réponses: 96
    Dernier message: 03/11/2009, 22h57
  4. probleme de compilation :remplissage de la table de hachage
    Par étoile de mer dans le forum Débuter
    Réponses: 79
    Dernier message: 22/10/2009, 10h20
  5. Réponses: 11
    Dernier message: 04/08/2003, 15h30

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