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 :

compréhension de code (tableaux)


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mai 2009
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 19
    Par défaut compréhension de code (tableaux)
    Bonjour,

    est ce que quelqu'un, plein de bonne volonté, pourrai m'expliquer ce code ?

    le résultat convient presque à mes attentes mais je n'arrive pas à déchiffrer le code (surtout au niveau de la syntaxe des tableaux),
    si je veux le façonner pour mon cas d'utilisation il faut que je le comprenne.

    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;
     
    open(TCD,"tcd") || die ("Erreur d'ouverture de tcd");
     
    my %h;
    my $l;
    my @col = 'A' .. 'D';
    while(<TCD>){
      next if /^$/;
      /(\w+)\s*(\w+)\s*(\w+)/;
      push @{$h{$3}{$1}},$2;
     
      for $l(@col){
        push @{$h{$3}{$l}},0 unless exists $h{$3}{$l};
      }
    }
     
    print "machine @col\n";
    for my $k(keys %h){
      print "$k";
      for my $kk(sort keys %{$h{$k}}){
        print " ",eval ( join "+",@{$h{$k}{$kk}});
      }
      print "\n";
    }
    le fichier TCD :

    A 20 machine1
    B 5 machine1
    A 5 machine2
    C 10 machine2
    A 50 machine1
    A 20 machine1
    B 5 machine1
    A 5 machine2
    C 10 machine2
    D 50 machine1
    D 20 machine1




    le résultat :

    machine A B C D
    machine1 90 10 0 70
    machine2 10 0 20 0


    et l'autre question, a quel moment intervient l'addition (parce que je n'en veux pas)?

    merci !

  2. #2
    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
    tu devrais déjà commenter le code pour nous montrer ce que tu comprends et ce que tu ne comprends pas

  3. #3
    Membre averti
    Inscrit en
    Mai 2009
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 19
    Par défaut
    bonne idée...
    et 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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    #!/usr/bin/perl
     
    use warnings;
    use strict;
     
    #ouverture du fichier TCD
    open(TCD,"tcd") || die ("Erreur d'ouverture de TCD");
     
    #déclaration table de hachage
    my %h;
    # déclaration variable scalaire
    my $l;
    #déclaration d'une liste de A jusqu'a D.
    my @col = 'A' .. 'D';
     
    #tant qu'il y a des ligne dans le fichier TCD
    while(<TCD>){
      # cette ligne je ne comprends pas
      next if /^$/;
     
      # expression réguliere : mot espace mot espace mot   
      /(\w+)\s*(\w+)\s*(\w+)/;
     
      # cette ligne je ne comprends pas
      push @{$h{$3}{$1}},$2;
     
      # pour la ligne $l de mon tableau col (mais je ne suis pas sur de comprendre...)
      for $l(@col){
        # cette ligne je ne comprends pas :
        push @{$h{$3}{$l}},0 unless exists $h{$3}{$l};
      }
    }
     
     
    # affichage des entetes de mon tableau de résultat.
    print "machine @col\n";
     
    #tout le bloc suivant je ne comprends pas
    for my $k(keys %h){
      print "$k";
      for my $kk(sort keys %{$h{$k}}){
        print " ",eval ( join "+",@{$h{$k}{$kk}});
      }
      print "\n";
    }
    merci

  4. #4
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      # cette ligne je ne comprends pas
      next if /^$/;
    C'est une forme d'expression conditionnelle propre à Perl : l'instruction next est executée si /^$/ est vrai.

    L'expression /^$/ est une expression booléenne correspondant à la recherche de motif (regexp) dans la variable $_ (variable implicite mise à jour dans le while(<FIC>) par le contenu de chaque ligne).
    L'expression régulière (le motif) spécifie qu'il ne doit y avoir aucun caractère entre le début et la fin de la ligne (soit une ligne vide).
    Donc, on saute les lignes vides avec next if /^$/

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      # cette ligne je ne comprends pas
      push @{$h{$3}{$1}},$2;
    La fonction push opère sur un tableau en ajoutant un ou plusieurs éléments à la fin du tableau.
    Le tableau concerné est @{$h{$3}{$1}} et l'élément ajouté est $2 ($1, $2, $3 sont des variables automatiques mise à jour par l'expression régulière exécutée juste avant).
    Le tableau en question est stocké dans une variable de type hashage qu'on pourrait apparenté à une structure dans les autres langages.
    %h est donc un hash dont une des clés est $3.
    Le contenu de $h{$3} est lui-même également un hash (plus précisément une référence à un hash) et l'une des clés de ce 2e hash doit être $1. Une notation plus adaptée aurait été : $h{$3}->{$1}.
    Le contenu de $h{$3}{1} est lui même un tableau (plus précisément une référence à un tableau). On le déréférence pour obtenir le tableau à fournir à push en le préfixant de @ (et en précisant la portée avec les accolades) : @{$h{$3}{$1}}

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        # cette ligne je ne comprends pas :
        push @{$h{$3}{$l}},0 unless exists $h{$3}{$l};
    Avec les explications des deux premières lignes, tu devrais comprendre celle-ci, qui condense les deux écritures : push dans un tableau selon une condition (unless === if not).

    Précision : la fonction exists permet de vérifier l'existence d'une clé dans un hash.

  5. #5
    Membre averti
    Inscrit en
    Mai 2009
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 19
    Par défaut
    wahou
    merci,
    ca me rassure je n'aurais pas trouvé tout seul.

    je vais étudier ta réponse...

  6. #6
    Membre averti
    Inscrit en
    Mai 2009
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 19
    Par défaut
    bonjour,

    grâce à votre aide, j'ai compris dans l'ensemble le code, je suis arrivé a l'adapter à mes données.

    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
    #!/usr/bin/perl
    use strict;use warnings;
     
    my %h;
     
    while(<DATA>){
      /(\w+)\s*(\w+)\s*(\w+)/;
      push @{$h{$1}{$2}},$3;
     
      push @{$h{$1}{'ZTA'}},0 unless exists $h{$1}{'ZTA'};
      push @{$h{$1}{'VP3'}},0 unless exists $h{$1}{'VP3'};
      push @{$h{$1}{'V23'}},0 unless exists $h{$1}{'V23'};
      push @{$h{$1}{'VA3'}},0 unless exists $h{$1}{'VA3'};
      push @{$h{$1}{'V02'}},0 unless exists $h{$1}{'V02'};
      push @{$h{$1}{'VA5'}},0 unless exists $h{$1}{'VA5'};
    }
     
    print "tc V02 V23 VA3 VA5 VP3 ZTA\n";
    for my $k(keys %h){
     
      print "$k";
      for my $kk(sort keys %{$h{$k}}){
      print " ",eval ( join "+",@{$h{$k}{$kk}});
      }
    print "\n";
    }
    __END__
    ROLE_B VA3 1
    ROLE_A V23 0
    ROLE_A ZTA 1
    ROLE_A VP3 1
    ROLE_C VA5 0
    ROLE_C V23 1
    ROLE_B V23 1
    ROLE_B V02 1

    quelqu'un peut t'il m'aider pour remplacer le bout de code suivant par une boucle car mes valeurs ZTA, VP3... peuvent varier:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
      push @{$h{$1}{'ZTA'}},0 unless exists $h{$1}{'ZTA'};
      push @{$h{$1}{'VP3'}},0 unless exists $h{$1}{'VP3'};
      push @{$h{$1}{'V23'}},0 unless exists $h{$1}{'V23'};
      push @{$h{$1}{'VA3'}},0 unless exists $h{$1}{'VA3'};
      push @{$h{$1}{'V02'}},0 unless exists $h{$1}{'V02'};
      push @{$h{$1}{'VA5'}},0 unless exists $h{$1}{'VA5'};
    merci pour votre aide.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 12/01/2007, 09h42
  2. [VB-Access]recset! Pb de compréhension de code
    Par sk8bcn dans le forum VBA Access
    Réponses: 5
    Dernier message: 15/12/2006, 15h26
  3. Compréhension du code
    Par Ivanelis dans le forum Assembleur
    Réponses: 3
    Dernier message: 12/06/2006, 12h08
  4. [Smarty] problème compréhension sur les tableaux
    Par mohican13 dans le forum Bibliothèques et frameworks
    Réponses: 11
    Dernier message: 09/02/2006, 16h44
  5. protection du code : tableaux dynamiques
    Par Tchaill39 dans le forum Langage
    Réponses: 6
    Dernier message: 12/01/2006, 21h42

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