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 :

Problèmes de Hashages et de Tableaux


Sujet :

Langage Perl

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2005
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 13
    Points : 10
    Points
    10
    Par défaut Problèmes de Hashages et de Tableaux
    Je suis en train de faire un programme Perl qui permet de faire un suivi du lancement de logiciel. Dès que l'on va lancer ou fermer le programme, le script va se lancer pour ajouter les infos nécessaires. Ce programme lit dans un fichier texte structuré de cette forme :

    date@login@heureDebut1@heureFin1@heureDebut2 ...

    (note : il y a minimum heureDebut1, après ça dépends du nombre de fois où la personne lance et ferme le programme une même journée)

    et j'ai une structure assez compliquée pour stocker tout ça :
    C'est un hashage de hashages de tableaux de hashages (HHTH pour la suite... c'est moins long à écrire!)

    Pour lire l'heure du début du premier lancement du logiciel, je ferai ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    print $hash{'Jack.Poulette'}{'21/07/2005'}[0]{'debut'};
    Voilà le but. J'ai trouvé une source sur le net avec des structures compliquées dont ce fameux HHTH! Mais j'ai un message d'erreur bizarre :
    "Can't coerce array into hash line 21"

    et à la ligne 21, j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    print $tabHours[0]{debut};
    je met le code juste avant :

    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
     
    while($ligneCourante = <LOG>) {
     
    	chomp $ligneCourante;
    	local @tabTemp = split /@/, $ligneCourante;	
     
    	#Création du tableau de hashages des horaires
    	local @tabHours = [];
    	for(my $i=2;$i<scalar @tabTemp;$i+=2) {
    		push @tabHours,{
    			debut	=>	$tabTemp[$i],
    			fin		=>	$tabTemp[$i+1]
    		};
    	}
    	print $tabHours[0]{debut};
    }
    Notes : j'ai ouvert le fichier au tout début avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    open(LOG,'D:\Perl\hist.log') or die("Impossible d'ouvrir l'historique");
    Et sinon, quand je mets :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    print $tabTemp[$i]."\t".$tabTemp[$i+1]."\n";
    j'ai les bons horaires qui s'affichent!

    Aidez MOIIIII!!!

  2. #2
    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
    Tu ne devrais pas utiliser local() mais plutôt my() pour déclarer tes variables, local() ne déclare absolument pas une variable locale au sens courant mais transforme momentanément la valeur d'une variable globale. De plus ta déclaration de tableau est étrange, j'ai l'impression que tu confonds référence de tableau et tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    local @tabHours = [];
    Ceci "déclare" (incorrectement puisque tu utilises "local()") un tableau dont le premier élément est une référence à un tableau vide, ce qui explique tes difficultés par la suite puisque c'est de ce premier élément que tu essaies de prendre le "début".

    Ton code devrait être :
    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
     
    while( my $ligneCourante = <LOG> ) {
     
       chomp $ligneCourante;
       my @tabTemp = split /@/, $ligneCourante;   
     
       #Création du tableau de hashages des horaires
       my @tabHours;
       for(my $i=2;$i<scalar @tabTemp;$i+=2) {
          push @tabHours,{
             debut   =>   $tabTemp[$i],
             fin      =>   $tabTemp[$i+1]
          };
       }
       print $tabHours[0]{debut};
    }

  3. #3
    Membre à l'essai
    Inscrit en
    Juin 2005
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 13
    Points : 10
    Points
    10
    Par défaut
    Ouais, ça à l'air de mieux fonctionner.

    J'avoue que mon utilisation du local est très bancale vu que je croyais que ça faisait autre chose (par rapport à sa visibilité).

    En fait, je pensais que dans le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    my $poulet;
    #Instruction 1
    if($poulet =~ /ailes/) {
        #Instruction 2
    }
    ... la variable $poulet était visible par l'instruction 1 mais pas par la 2e... et je pensais que local me permettait de la rendre visible dans l'instruction 2. Mais c'est faux, $poulet est bien visible dans l'instruction 2, nan?

    sinon, j'ai un autre petit problème toujours avec mon HHTH!
    juste avant la derniere } de ce petit bout de code :
    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
     
    while($ligneCourante = <LOG>) {
     
       chomp $ligneCourante;
       local @tabTemp = split /@/, $ligneCourante;   
     
       #Création du tableau de hashages des horaires
       local @tabHours = [];
       for(my $i=2;$i<scalar @tabTemp;$i+=2) {
          push @tabHours,{
             debut   =>   $tabTemp[$i],
             fin      =>   $tabTemp[$i+1]
          };
       }
       print $tabHours[0]{debut};
    }
    ... il faut que j'insère les horaires (tableaux de hashages), dans mon HHTH que j'ai nommé tout simplement $hash.
    Voilà mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    	#ajout des dates
    	$date = {};
    	$date->{$tabTemp[0]} = \@tabHours;
    	$hash->{$tabTemp[1]} = $date;
     
    	print $date{20/07/2005}[0]{debut};
    Encore une fois le print de fin ne m'imprime rien du tout! Mon idée était de décomposer le HHTH pour mieux le générer. dans la première partie (premier post) j'ai fait le tableau de hashages qui contient les horaires. Ma variable $date va contenir la référence à un hashage anonyme (dites moi si je me trompe, je connais pas encore toutes les finalités de Perl) donc je l'initialise dans la 1e ligne. Dans ce hashage, je lui définis une clef, qui est en fait la date, et sa valeur, qui contient la référence au tableau de hashages des horaires.

    Ensuite, j'ajoute la référence du HTH ($date) dans mon hashage %hash ayant pour clef le nom d'utilisateur ($tabTemp[1]) à l'avant dernière ligne.

    D'ailleurs, en ce qui concerne l'avant dernière ligne, si la clef $tabTemp[1] que je spécifie pour %hash n'existe pas, il la crée, non?

    Je voudrais surtout comprendre mes erreurs, j'adore Perl pour sa puissance, mais comme le disait Victor Hugo : "Sans maîtrise, la puissance n'est rien"

  4. #4
    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
    Alors...
    Tu devrais vraiment lire perlreftut ("perldoc perlreftut" dans un shell si tu ne sais pas où trouver), ça t'éclaircirait sûrement les idées.
    Voici la syntaxe pour accéder à une valeur dont la clé est "key" dans un hash %mon_hash :
    Même chose mais maintenant $ma_hashref est une référence sur le hash précédent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $ma_hashref->{key}
    Par ailleurs, tes initialisations sont inutiles puisqu'elles sont vides, tu devrais te contenter de déclaration (avec un my()), au final ton code devrait être :
    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
     
    my %hash;
     
    while($ligneCourante = <LOG>) {
     
       chomp $ligneCourante;
       my @tabTemp = split /@/, $ligneCourante;   
     
       #Création du tableau de hashages des horaires
       my @tabHours;
       for(my $i=2;$i<scalar @tabTemp;$i+=2) {
          push @tabHours,{
             debut   =>   $tabTemp[$i],
             fin      =>   $tabTemp[$i+1]
          };
       }
     
       $hash{$tabTemp[1]}{$tabTemp[0]} = \@tabHours;
     
       print $hash{$tabTemp[1]}{20/07/2005}[0]{debut}; 
     
       print $tabHours[0]{debut};
    }
    Utilise des my() et mets un "use strict;" au début de ton code avant de répondre, sinon je pense que je ne répondrais plus.

    --
    Jedaï

  5. #5
    Membre à l'essai
    Inscrit en
    Juin 2005
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 13
    Points : 10
    Points
    10
    Par défaut
    C'est vrai qu'avec use strict, ça m'aide beaucoup!
    Ça a l'air d'aller mieux quand même!

    Merci beaucoup!

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

Discussions similaires

  1. [Tableaux] Problème de syntaxe avec les tableaux et include
    Par L'aigle de Carthage dans le forum Langage
    Réponses: 3
    Dernier message: 12/03/2008, 10h41
  2. Problème en mémoire avec des tableaux
    Par dword2add dans le forum C++
    Réponses: 3
    Dernier message: 11/11/2007, 13h36
  3. Problème de débutant dans les tableaux
    Par mat1450 dans le forum C++
    Réponses: 8
    Dernier message: 17/08/2007, 19h09
  4. Réponses: 3
    Dernier message: 20/04/2007, 12h19
  5. problème très étrange avec mes tableaux
    Par lelutin dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 08/09/2006, 14h47

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