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 :

Parcourir un tableau de table de hash


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Inscrit en
    Mai 2008
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 7
    Par défaut [RESOLUT] Parcourir un tableau de table de hash
    Bonjour,

    Je debute en Perl et j'ai lu le post qui explique comment trier un tableau de hash...
    Mais je reste bloquee.

    Voici mon code qui remplie une table de hash :
    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
     
    sub storeDataToAnalyse {
    $link = $_[0];
    open(CROCOMAIL, MAIL_TMP_FILE) || die ("Erreur d'ouverture de CROCOMAIL") ;
    print "Data to nanlyse for $link:\n";
    %datalines = ();
    while (my $line = readline(CROCOMAIL)) {
    	if ($line  =~ "Link Percentage") {
    		last;
    	}
    }
    while (my $line = <CROCOMAIL>) {
    	if ($line =~  $link) {
    		$line = (<CROCOMAIL>);
    		for ($i = 0, $j = 0; $line = <CROCOMAIL>; $i++) {
    			if ($line =~ /^\s*$/) {
    				last;
    			}
    			if ($i > 1) {
    				($mb, $ips, $ipd) = split (/;/, $line);
    				$datalines{$j}{ 'Mbyte' } = $mb;
    				$datalines{$j}{ 'IPSource' } = $ips;
    				$datalines{$j}{ 'IPDest'} =  $ipd;
    				$j++;
    			}
    		}
    		last;
    	}
    }
    close(CROCOMAIL);
    chomp (%datalines);
    print "return:".\$datalines."\n"; 
    return \%datalines;
    }
    Voici le code qui appel storeDataToAnalyse et qui derait lire la table retourner et l'ajouter a un tableau :
    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
     
    my $data2 = ();
    my $size = @$link_analyse;
    my @finaldata = ();
    for (my $k=0; $k < $size; $k++) {
    	$data2 = storeDataToAnalyse("$link_analyse->[$k][0]");
    	$finaldata[$k] = $data2;
    	$pp = $finaldata[$k];
    	chomp (%datalines);
    	my $sz = keys(%datalines);
    	for (my $kk = 0; $kk < $sz ; $kk++) {
    		print "Mbyte:$datalines{$kk}{'Mbyte'} IPSource:$datalines{$kk}{'IPSource'} IPDest:$datalines{$kk}{'IPDest'}";
                              print "pp11 = $pp{$kk}{'Mbyte'}\n"
    	}	
    	print "!!!!!!!!!!!!!!finaldata :".$pp."\n";
    	my $sizetot = @finaldata;
    	print "sissetot=$sizetot\n";
    }
    voila mes trois problemes :
    1/ si je limite la portee de %dataline avec "my" dans storeDataToAnalyse et que j'utilise data2, je n'arrive pas a faire le print.
    Je pense clairement que quelque chose m'echappe avec les references...
    2/ print "!!!!!!!!!!!!!!finaldata :".$pp."\n"; affiche "!!!!!!!!!!!!!!finaldata :HASH(0x1860ae4)
    alors que
    print "return:".\$datalines."\n"; affiche "return SCALAR(0x183c8f4)"
    3/print de $finaldata[$k] et de $pp{$kk}{'Mbyte'} n'affiche rien...

    Malgres mes lectures de tuto, il y a clairement quelque chose que je n'ai pas compris dans les bases...
    J'espere avoir etait clair dans l'explication de mon probleme :/

    Merci d'avance pour votre aide!

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Par défaut
    Un premier conseil serait d'utiliser Data::Dumper pour afficher tes variables plutôt que print, tu y verras plus clair pour les variables hash et tableaux.

    Sinon tu fais return \%datalines mais ton print affiche \$dataline qui est une référence à une variable non déclarée qui n'a rien à voir avec %datalines. Car en Perl $var et @var et %var sont des variables distinctes.

    D'autre part tu peux (tu devrais) faire En revanche pour le j'avoue ne pas comprendre ce que tu cherches à faire avec cette instruction appliquée à un hash.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Mai 2008
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 7
    Par défaut Merci
    Bonjour Estofilo,

    Merci pour tes conseils je vais me pencher sur ta reponse et je reviens!
    En attendant: le chomp c'est parceque le dernier champ contient un "\n" et je voulais le suprimer...

    J'avais trouver cette commande dans un tuto et elle etait bien appliquee a un hash... mais vu comment tu le presente... je me dis que je devrais plutot faire :
    chomp($datalines{$j}{ 'IPDest'});

    Oui, je pensais que $datalines representait le contenu et %datalines la reference... alors en fait, comme $, % et @ n'ont pas l'air liee... et que \% represente la reference... je comprend toujours pas pourquoi j'ai trouve ca dans des tuto :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    my %HoH = ();
    $uid = "123";
    $HoH{ $login }{ 'uid' }=$uid;
    pourquoi n'ecrit-on pas %HoH{ $login }{ 'uid' }=$uid ? Je vais relire mes tuto... un peu plus lentement...

    D'apres tes explications (si j'ai bien compris) concernant les declarations, je vais essayer quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    sub storeDataToAnalyse { 
    ...
    my %datalines = ();
    return \%datalines;
    }
     
    my @fullhash = (); // qui contiendra les references
    for ($i = 0; $i < $sz; $i++) {
       $fullhash[$i] = storeDataToAnalyse ("$link_analyse->[$k][0]");
    }
    et pour les afficher un element ce sera quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    print $fullhash[$i]->{$k}->{'Mbit'}
    et la j'utiliserai des fleches car les valeurs stocker dans le tableau sont des references \% a des tables de hash%...
    Et j'utilise $fullhash[$i], car ce qui m'interesse c'est le contenu du tableau $fullhash a l'index $i...
    donc $ dans ce cas, represente bien le contenu de fullhash?

    Je vais tester tout ca et je reviens demain

    Merci!
    Ps : dsl, je suis pas tres synthetique... je fait des posts a ralonge!

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Par défaut
    J'avais trouver cette commande dans un tuto et elle etait bien appliquee a un hash... mais vu comment tu le presente... je me dis que je devrais plutot faire :
    chomp($datalines{$j}{ 'IPDest'});
    Oui. Mieux même, tu peux faire chomp de la ligne lue de ton fichier juste après l'avoir récupérée, c.a.d, avant de la découper en champs, en général c'est plutôt comme ça que c'est fait.

    pourquoi n'ecrit-on pas %HoH{ $login }{ 'uid' }=$uid
    Ca aurait une certaine logique mais le fait est que c'est bien le signe $ qu'il faut utiliser quand on "déréférence" un hash. C'est comme ça :)

    print $fullhash[$i]->{$k}->{'Mbit'}
    OK sauf pour la 2eme flèche. C'est plutôt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print $fullhash[$i]->{$k}{'Mbit'}
    à moins que tu ne modifies aussi l'affectation pour utiliser ...->{'Mbit} (c.a.d que les 2 formes sont possibles mais pas un mélange des 2).

    Et j'utilise $fullhash[$i], car ce qui m'interesse c'est le contenu du tableau $fullhash a l'index $i...
    donc $ dans ce cas, represente bien le contenu de fullhash?
    C'est bien ça, $fullhash[$i] désigne l'élément $i du tableau @fullhash.

  5. #5
    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
    Citation Envoyé par estofilo Voir le message
    OK sauf pour la 2eme flèche. C'est plutôt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print $fullhash[$i]->{$k}{'Mbit'}
    à moins que tu ne modifies aussi l'affectation pour utiliser ...->{'Mbit} (c.a.d que les 2 formes sont possibles mais pas un mélange des 2).
    En fait "$fullhash[$i]->{$k}->{Mbit}", "$fullhash[$i]->{$k}{Mbit}" et "$fullhash[$i]{$k}{Mbit}" sont exactement la même chose, car $fullhash[$i]{$k} ne peut pas avoir de sens valable différent de $fullhash[$i]->{$k} (un tableau ne peux contenir que des scalaires), alors que $fullhash[$i] et $fullhash->[$i] sont tout deux des syntaxes valables ayant deux sens différents.

    --
    Jedaï

  6. #6
    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
    Je préconiserais toujours, pour ma part, l'usage de -> lorsque l'on souhaite déréférencer un référence de hash, de sub ou de array, ce qui évite toute confusion... es-tu d'accord Jedaï ?

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

Discussions similaires

  1. Thread Perl : Partager un tableau de tables de hash
    Par azertyter dans le forum Langage
    Réponses: 1
    Dernier message: 03/04/2014, 22h14
  2. tableau de tables de hash référence perl
    Par sbtrinity dans le forum Langage
    Réponses: 11
    Dernier message: 12/03/2012, 14h02
  3. parcourir un tableau aléatoirement
    Par khayyam90 dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 01/12/2004, 13h44
  4. [langage] Parcourir un tableau
    Par Jibees dans le forum Langage
    Réponses: 13
    Dernier message: 22/04/2003, 14h18
  5. Tables de hash
    Par miss8 dans le forum C
    Réponses: 2
    Dernier message: 16/11/2002, 17h44

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