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

  1. #1
    Candidat au Club
    Inscrit en
    Mai 2008
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 7
    Points : 3
    Points
    3
    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 émérite
    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
    Points : 2 890
    Points
    2 890
    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
    Candidat au Club
    Inscrit en
    Mai 2008
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 7
    Points : 3
    Points
    3
    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 émérite
    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
    Points : 2 890
    Points
    2 890
    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 é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
    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 : 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 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ï ?
    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

  7. #7
    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
    Citation Envoyé par Philou67430 Voir le message
    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ï ?
    Je ne suis pas sûr de ce que tu demandes ?
    Je suis favorable à l'usage de "$fullhash[$i]{$k}{Mbit}" plutôt que "$fullhash[$i]->{$k}->{Mbit}", par contre je préfère "$array_ref->[5]" à "${$array_ref}[5]".

    Mais c'est une question de goût je suppose.

    --
    Jedaï

  8. #8
    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 voulais dire que je préfère toujours utiliser -> sur une référence, même lorsqu'il n'est pas nécessaire, ce qui évite de faire croire qu'il existe des tableaux de hash de ... mais qui met bien en évidence qu'il s'agit de tableaux de références.
    C'est aussi un bon séparateur visuel qui aide à lire des expressions parfois un peu "alambiquées".
    Je n'ai pas le PBP sous le main, mais je ne serais pas surpris qu'ils préconisent un choix ou l'autre.
    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

  9. #9
    Membre émérite
    Avatar de Jasmine80
    Femme Profil pro
    Bioinformaticienne
    Inscrit en
    Octobre 2006
    Messages
    3 157
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    Points : 2 673
    Points
    2 673
    Par défaut
    Citation Envoyé par Philou67430 Voir le message
    Je n'ai pas le PBP sous le main, mais je ne serais pas surpris qu'ils préconisent un choix ou l'autre.
    Oui, en effet page 227, premier conseil au sujet des références 'Wherever possible, dereference with arrows';
    -- Jasmine --

  10. #10
    Candidat au Club
    Inscrit en
    Mai 2008
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 7
    Points : 3
    Points
    3
    Par défaut Merci bcp!
    Bonjour,

    Bon j'avoue que j'ai eu un peu de mal a suivre le debat...
    :/

    Mais vous m'avez quand meme grandement aider....
    Ca fonctionne !
    Je n'y ai pas toucher pendant 2 jours et la hop! je vous ai lus et en 5 minutes c'etait fait!

    Bon je n'ai pas encore regarder Data:umper, mais je vais m'y pencher...
    De toute facon il faut aussi que je trouve un module sympa pour faire du reseau... nslookup, ping, telnet, ssh, traceroute,...
    et je vais afficher mes resultats dans une page php...

    Merci encore!
    A bientot

    Pour ceux qui auront le meme probleme que moi a l'avenir: j'ai fait ca(vous pourrez voir dans mes print que je n'ai pas tancher le debat!)
    J'imagine que vous aller trouver mon code moche... mais bon, pour l'instant je cherche pas a faire intellegent mais fonctionnel...
    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
    53
     
    sub storeDataToAnalyse {
    	my $link = $_[0];
    	open(CROCOMAIL, MAIL_TMP_FILE) || die ("Erreur d'ouverture de CROCOMAIL") ;
    	print "Data to nanlyse for $link:\n";
    	my %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'} =  chomp($ipd);
    					$j++;
    				}
    			}
    			last;
    		}
    	}
    	close(CROCOMAIL);
    	print "return = ".\%datalines."\n";
    	return \%datalines;
    }
     
    my $data = ();
    my $size = @$link_analyse;
    my @fullhash = ();
    for (my $k=0; $k < $size; $k++) {
    	print "-------------------------------------------------------------------\n";
    	$fullhash[$k] = storeDataToAnalyse("$link_analyse->[$k][0]");
    	print "fullhash[$k] = $fullhash[$k]\n";
    }
    print "======================================\n";
    my $fullsize = @fullhash;
    for (my $k=0; $k < $fullsize; $k++) {
    	my $hashsize = keys (%{$fullhash[$k]});
    	print "\n$link_analyse->[$k][0], $link_analyse->[$k][1]%:\n";
    	for (my $kk = 0; $kk < $hashsize ; $kk++) {
    		print "fullhash[$k]->{$kk}->{'Mbyte'} = $fullhash[$k]{$kk}{'Mbyte'}\n";
    		print "fullhash[$k]->{$kk}->{'IPSource'} = $fullhash[$k]{$kk}{'IPSource'}\n";
    		print "fullhash[$k]->{$kk}->{'IPDest'} = $fullhash[$k]{$kk}{'IPDest'}\n";
    	}
    }

+ 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