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 :

[Résolu]Pb. remplir un tableau de hash avec un tableau


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    chômeur
    Inscrit en
    Juillet 2017
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : chômeur

    Informations forums :
    Inscription : Juillet 2017
    Messages : 39
    Par défaut [Résolu]Pb. remplir un tableau de hash avec un tableau
    Bonjour, débutant en Perl et trifouillant un simple programme répertoire, je voudrais que chaque entrée puisse avoir plusieurs n° de téléphone.
    La forme du tableau :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    @repertoire [
                 {
                   prenom => prénom
                   nom    => nom
                   tels   => [tel1,tels2 …]
                 }
                ]
    Pour remplir ce @repertoire j'utilise le fichier repertoire, de la forme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Éric#Dumont#1111111111#2222222222#
    Marcelle#Amelac#3333333333#
    Syvain#Boyer#4444444444#5555555555#6666666666#
    Colette#Masson#7777777777#
    Voici le code que j'ai écris :

    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
    #!/usr/bin/env perl
    use strict;
    use warnings;
    use diagnostics;
    use Smart::Comments;
    use Data::Dumper;
    use feature ":5.24";
     
    my $repertoire = "repertoire";  # fichier
    my @repertoire ;                # le repertoire (array de hash)
    my ($nom, $prenom, $tel);       # variables temporaires
    my @tels;                       # liste de n° de téléphone
     
    sub ouvrir_repertoire {
        if (-e $repertoire) {
            open my $REP, "<", "$repertoire" or die "Impossible de lire $repertoire : $!";
     
            while (<$REP>) {
                chomp;
                say;
                ($nom, $prenom, @tels) = split(/#/);
                ### nom: $nom
                ### prenom: $prenom
                ### tel: @tels
                push (@repertoire,{ 'prenom' => $prenom,
                                    'nom'    => $nom,
                                    'tels'    => \@tels
                                  });
            }
            ### @repertoire
            close $REP;
        } else {
            # ajouter_entree(); # si le fichier n'existe pas creer repertoire
        }
        return;
    }
     
    ouvrir_repertoire;
    J'utilise Smart::Comments, sorte de Data:umper en plus simple, pour visualiser le contenu de mes variables et voici ce que j'obtiens :

    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
     
    ### nom: 'Éric'
    ### prenom: 'Dumont'
    ### tel: [
    ###        '1111111111',
    ###        '2222222222'
    ###      ]
     
    ### nom: 'Marcelle'
    ### prenom: 'Amelac'
    ### tel: [
    ###        '3333333333'
    ###      ]
     
    ### nom: 'Syvain'
    ### prenom: 'Boyer'
    ### tel: [
    ###        '4444444444',
    ###        '5555555555',
    ###        '6666666666'
    ###      ]
     
    ### nom: 'Colette'
    ### prenom: 'Masson'
    ### tel: [
    ###        '7777777777'
    ###      ]
     
    ### @repertoire: [
    ###                {
    ###                  nom => 'Éric',
    ###                  prenom => 'Dumont',
    ###                  tels => [
    ###                            '7777777777'
    ###                          ]
    ###                },
    ###                {
    ###                  nom => 'Marcelle',
    ###                  prenom => 'Amelac',
    ###                  tels => $VAR1->[0][0]{tels}
    ###                },
    ###                {
    ###                  nom => 'Syvain',
    ###                  prenom => 'Boyer',
    ###                  tels => $VAR1->[0][0]{tels}
    ###                },
    ###                {
    ###                  nom => 'Colette',
    ###                  prenom => 'Masson',
    ###                  tels => $VAR1->[0][0]{tels}
    ###                }
    ###              ]
    Je ne comprends pas. Dans un premier temps le fichier est bien lu et les variables bien affectées. Mais le remplissage de @repertoire avec les téléphones foire. Le seul n° qui peuple le tableau c'est le dernier du fichier et pas au bon endroit.

    Merci pour votre coup de main.

  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,

    je ne peux pas tester maintenant sur ma tablette, mais je suggère d'essayer le programme modifié suivant:
    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
     
    #!/usr/bin/env perl
    use strict;
    use warnings;
    use diagnostics;
    use Smart::Comments;
    use Data::Dumper;
    use feature ":5.24";
     
    my $repertoire = "repertoire";  # fichier
    my @repertoire ;                # le repertoire (array de hash)
    # my ($nom, $prenom, $tel);       # utiliser des variables locales dans le fonction, pas des variables globales
    # my @tels;                       # idem
     
    sub ouvrir_repertoire {
        if (-e $repertoire) {
            open my $REP, "<", "$repertoire" or die "Impossible de lire $repertoire : $!";
     
            while (<$REP>) {
                chomp;
                say;
                my ($nom, $prenom, @tels) = split(/#/);
                ### nom: $nom
                ### prenom: $prenom
                ### tel: @tels
                push (@repertoire,{ 'prenom' => $prenom,
                                    'nom'    => $nom,
                                    'tels'    => [@tels],  # utilisation du constructeur de tableau anonyme
                                  });
            }
            ### @repertoire
            close $REP;
        } else {
            # ajouter_entree(); # si le fichier n'existe pas creer repertoire
        }
        return;
    }

  3. #3
    Membre averti
    Homme Profil pro
    chômeur
    Inscrit en
    Juillet 2017
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : chômeur

    Informations forums :
    Inscription : Juillet 2017
    Messages : 39
    Par défaut
    Merci. Mais je viens de tester le code et j'ai exactement le même résultat :<

  4. #4
    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,

    je ne vois pas ce qui ne marche pas chez toi.

    J'ai testé le programme suivant:

    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/env perl
    use strict;
    use warnings;
    use utf8;
    use Data::Dumper;
    use feature 'say';
     
    my @repertoire ;                # le repertoire (array de hash)
     
    sub lire_données {
     
            while (<DATA>) {
                chomp;
                say;
                my ($nom, $prenom, @tels) = split(/#/);
                push (@repertoire,{ 'prenom' => $prenom,
                                    'nom'    => $nom,
                                    'tels'    => [@tels],  # utilisation du constructeur de tableau anonyme
                                  });
            }
    }
    lire_données;
    print Dumper \@repertoire;
    __DATA__
    Eric#Dumont#1111111111#2222222222#
    Marcelle#Amelac#3333333333#
    Syvain#Boyer#4444444444#5555555555#6666666666#
    Colette#Masson#7777777777#
    Et ça m'affiche ce que tu me paraît désirer:
    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
     
    $ perl repertoire.pl
    Eric#Dumont#1111111111#2222222222#
    Marcelle#Amelac#3333333333#
    Syvain#Boyer#4444444444#5555555555#6666666666#
    Colette#Masson#7777777777#
    $VAR1 = [
              {
                'nom' => 'Eric',
                'prenom' => 'Dumont',
                'tels' => [
                            '1111111111',
                            '2222222222'
                          ]
              },
              {
                'nom' => 'Marcelle',
                'prenom' => 'Amelac',
                'tels' => [
                            '3333333333'
                          ]
              },
              {
                'nom' => 'Syvain',
                'prenom' => 'Boyer',
                'tels' => [
                            '4444444444',
                            '5555555555',
                            '6666666666'
                          ]
              },
              {
                'nom' => 'Colette',
                'prenom' => 'Masson',
                'tels' => [
                            '7777777777'
                          ]
              }
            ];

  5. #5
    Membre averti
    Homme Profil pro
    chômeur
    Inscrit en
    Juillet 2017
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : chômeur

    Informations forums :
    Inscription : Juillet 2017
    Messages : 39
    Par défaut
    Ben en fait je ne sais pas ce que j'avais mal fait, effectivement ça marche. Je te remercie.

  6. #6
    Membre averti
    Homme Profil pro
    chômeur
    Inscrit en
    Juillet 2017
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : chômeur

    Informations forums :
    Inscription : Juillet 2017
    Messages : 39
    Par défaut
    Bien que j'ai marqué le sujet comme résolu je continue le fil car le problème suivant est en rapport.
    Problème : comment accéder aux données du tableau dans le hash.

    Avec le programme suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    sub affiche_repertoire {
        foreach my $personne (@repertoire) {     # parcours tout le répertoire
            printf ("%-20s %-20s", $personne->{prenom}, $personne->{nom});
            foreach my $tel (@$repertoire->{'tels'}) {
                printf ("%-15s", $tel);
            }
            print "\n";
        }
        return;
    }
    je n'ai pas de problème pour afficher les nom et prénom, sans la boucle "foreach my $tel …", mais je ne peux parcourir le tableau @$repertoire->{'tels'}, Perl me renvoyant l'erreur

    Can't use string ("repertoire") as an ARRAY ref while "strict refs" in use at
    ./test.pl line 58 (#1)
    (F) You've told Perl to dereference a string, something which
    use strict blocks to prevent it happening accidentally. See
    "Symbolic references" in perlref. This can be triggered by an @ or $
    in a double-quoted string immediately before interpolating a variable,
    for example in "user @$twitter_id", which says to treat the contents
    of $twitter_id as an array reference; use a \ to have a literal @
    symbol followed by the contents of $twitter_id: "user \@$twitter_id".
    Un petit coup de main serait le binevenu, merci.

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 04/05/2011, 14h50
  2. [C#] - Remplir tableau à deux dimensions avec split
    Par dada4444 dans le forum Windows Forms
    Réponses: 7
    Dernier message: 26/05/2009, 09h26
  3. Réponses: 6
    Dernier message: 23/05/2009, 16h29
  4. [c++] remplir tableau de bool avec cin
    Par djkamikaz dans le forum C++
    Réponses: 5
    Dernier message: 25/12/2007, 05h03
  5. remplir un dropdownlist avec un tableau de datarow
    Par bous_saad317 dans le forum ASP.NET
    Réponses: 1
    Dernier message: 13/07/2007, 09h45

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