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 :

mon programme marche pas


Sujet :

Langage Perl

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 19
    Points : 17
    Points
    17
    Par défaut mon programme marche pas
    Bonjour,

    J'ai commencé le langage perl il y a une semaine et j'ai un problème avec ce 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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    #!c:/Perl/bin/perl
    #use strict;
     
    open(CLASSEMENT, "classement.txt") or die("open classement.txt : $!");
     
     
    my %Classement;
    my ($esp1, $esp2, $esp3);
    my $esp_type = "R";
    my $l;
    my $i = 0;
     
    my $poub = <CLASSEMENT>;	
    while (defined($l = <CLASSEMENT>))
    {
    	print "$l\n";
    	if (($esp1, $esp2, $esp3) = ($l =~ /\s*(\w+|-)\s+(\w+|-)\s+(\w+|-)/))
    	{
    			push(@{${$Classement{1}}{$esp_type}}, $esp1) if ($esp1 != "-");
    			push(@{${$Classement{2}}{$esp_type}}, $esp2) if ($esp2 != "-");
    			push(@{${$Classement{3}}{$esp_type}}, $esp3) if ($esp3 != "-");
    			print " essai : ${${$Classement{1}}{$esp_type}}[$i]\n";
    			print "$esp1   $esp2   $esp3\n";
    			$i++;
    	}
    	else
    	{
    		if (($esp_type) = ($l =~ /^([RM])/)) {print "$esp_type\n";}
    	}
    }
    Une partie fonctionne puisqu'il m'affiche correctement la ligne lue (print "$l\n") et (print "$esp1 $esp2 $esp3\n") marche aussi correctement mais je n'arrive pas à remplir mon hash de hash de tableau Y a rien a faire j'ai essayé plein de trucs, il refuse. Donc il doit y avoir une erreur à la *$ù quelque part que je ne vois pas. Je suis donc obligé d'en appeller donc à votre générosité pour m'aider à résoudre ce bins

    Je m'attendais pas à bloquer sur un truc aussi couillon.

  2. #2
    Membre actif Avatar de mobscene
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    331
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 331
    Points : 234
    Points
    234
    Par défaut
    essaie sa ( pas testé )


    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
    #!c:/Perl/bin/perl
    #use strict;
     
    open(CLASSEMENT, "classement.txt") or die("open classement.txt : $!");
     
     
    my %Classement;
    my ($esp1, $esp2, $esp3);
    my $esp_type = "R";
    my $l;
    my $i = 0;
     
    my $poub = <CLASSEMENT>;	
    while (defined($l = <CLASSEMENT>))
    {
    	print "$l\n";
    	if (($esp1, $esp2, $esp3) = ($l =~ /\s*(\w+|-)\s+(\w+|-)\s+(\w+|-)/))
    	{
    			push( @{$Classement{$esp_type}}, $esp1) if ($esp1 != "-");
    			push( @{$Classement{$esp_type}}, $esp2) if ($esp2 != "-");
    			push( @{$Classement{$esp_type}}, $esp3) if ($esp3 != "-");
    			print "$esp1   $esp2   $esp3\n";
    			$i++;
    	}
    	else
    	{
    		if (($esp_type) = ($l =~ /^([RM])/)) {print "$esp_type\n";}
    	}
    }
    j'ai pas compris le :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     print " essai : ${${$Classement{1}}{$esp_type}}[$i]\n";
    Everybody have in their the potential to be their own god : Marilyn Manson

  3. #3
    Membre chevronné
    Avatar de Woufeil
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 1 076
    Points : 2 004
    Points
    2 004
    Par défaut
    Bonjour,

    Peux-tu expliquer plus précisément la structure que tu veux obtenir s'il te plaît ? Je ne suis pas sûr de tout comprendre, notemment cette partie :
    $classement{1} est, comme le $ le précise, forcément un scalaire, pourquoi veux tu forcer le contexte ?

    Essaie ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    push(@{$classement{1}{$esp_type}}, $esp1);
    Donc en résumant, %classement est une table de hachage, $classement{1} est une référence vers une table de hachage et $classement{1}{$esp_type} est une référence vers un tableau.

    Je te conseille d'utiliser le module Data:umper pour visualiser tes structures de données

    mobscene, ton code crée une table de hachage de tableau, il manque un niveau à ta structure
    "En essayant continuellement, on finit par réussir. Donc : plus ça rate, plus on a de chances que ça marche" (devise Shadock)
    Application :

    ainsi qu'à regarder la avant de poser une question.

    La rubrique Perl recrute, contactez-moi.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 19
    Points : 17
    Points
    17
    Par défaut
    Déjà, merci à tous les 2 pour vos réponses

    Effectivement mobscene, je cherche à obtenir un hash de hash de tableau donc il y a 3 niveaux

    Sinon je vais tenter d'expliquer mon raisonnement tordu pour faire mon hash de hash de tableau...

    Tout d'abord mon fichier à lire est composé de 3 colonnes. Chacune de ces colonnes est séparé en 2 blocs ce qui fait 6 blocs au total. Au début je pensais donc déclarer 6 tableaux séparés mais déjà ça me paraissait pas élégant et en plus je me suis dit que tenter de faire un hash de hash de tableau me permettrait de savoir si j'avais bien saisis l'utilisation des références (apparemment non ).

    Du coup, je déclare le hash %Classement. Le premier niveau contient les keys 1, 2 et 3 pour le numéro des colonnes. Le 2° niveau prend les clés $esp_type (il y en a 2 pour l'instant dans mes fichiers qui sont R ou M. Elles séparent les 2 blocs) et enfin le dernier un tableau de scalaires.
    Du coup pour accéder au hash anonyme donc les clés sont $esp-type j'utilise $Classement{(1,2 ou 3)} puis je pensais que, $Classement{(1,2 ou 3)} étant une référence, je devais faire ${$Classement{(1,2 ou 3)}}{(M ou R)} pour obtenir la référence au tableau correspondant (je pensais pas que $Classemment{i}{j} était possible Woufeil mais j'aurais dû m'en douter vu que je connaissais $exemple[i][j] ).

    Après pour le push je déréférence le tout avec @{} et pour avoir un élément du tableau je rajoute ${}[$i] (en fait je me suis beaucoup inspiré de la partie de la FAQ sur les références justement).

    Ouf! voilà j'éspère que j'ai pas été trop confus.

    Mais je viens d'essayer ceci comme tu m'as dis Woufeil et ça ne marche pas
    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
    #!c:/Perl/bin/perl
    #use strict;
     
    open(CLASSEMENT, "classement.txt") or die("open classement.txt : $!");
     
     
    my %Classement;
    my ($esp1, $esp2, $esp3);
    my $esp_type = "R";
    my $l;
    my $i = 0;
     
    my $poub = <CLASSEMENT>;	
    while (defined($l = <CLASSEMENT>))
    {
    	print "$l\n";
    	if (($esp1, $esp2, $esp3) = ($l =~ /\s*(\w+|-)\s+(\w+|-)\s+(\w+|-)/))
    	{
    			push(@{$Classement{1}{$esp_type}}, $esp1) if ($esp1 != "-");
    			push(@{$Classement{2}{$esp_type}}, $esp2) if ($esp2 != "-");
    			push(@{$Classement{3}{$esp_type}}, $esp3) if ($esp3 != "-");
    			print " essai : ${$Classement{1}{$esp_type}}[0]\n";
    			print "$esp1   $esp2   $esp3\n";
    			$i++;
    	}
    	else
    	{
    		if (($esp_type) = ($l =~ /^([RM])/)) {print "$esp_type\n";}
    	}
    }
    Sinon j'ai essayé aussi print " essai : $Classement{1}{$esp_type}[0]\n" (est-ce que cette écriture existe d'ailleurs?) mais ça ne marche pas non plus.

    Sinon pour le module data:umper, je vais effectivement y jeter un coup d'oeil mais il faut vraiment que je comprenne mon erreur

  5. #5
    Membre chevronné
    Avatar de Woufeil
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 1 076
    Points : 2 004
    Points
    2 004
    Par défaut
    En tout cas, le code que je t'es donnée met bien en place un hash de hash de tableau, je l'est testé avec Data Dumper

    Sinon, oui $Classement{1}{$esp_type}[0] est correct !

    Regarde mon programme de test pour t'en rendre compte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    use Data::Dumper;
     
    my %classement;
    push(@{$classement{1}{"indice"}}, "Test");
    #print Dumper(%classement);
    print $classement{1}{indice}[0];
    Tu obtiens quoi comme erreur ?
    Désolé j'ai pas trop le temps de me pencher sur ton code maintenant, mais si en début de soirée tu n'as pas trouvée la solution je l'étudirais avec plus d'attention
    "En essayant continuellement, on finit par réussir. Donc : plus ça rate, plus on a de chances que ça marche" (devise Shadock)
    Application :

    ainsi qu'à regarder la avant de poser une question.

    La rubrique Perl recrute, contactez-moi.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 19
    Points : 17
    Points
    17
    Par défaut
    Hum, j'ai trouvé mon erreur et elle était bien stupide comme je pensais...

    En fait si vous regardez plus en détail mon if ( $esp1 != '-') vous voyez pas une grosse conn... bétise?

    Ben oui je vous donne dans le mille, il fallait que je mette "ne" à la place de "!="

    Bon ben en tout cas je vous remercie à tous les 2 pour ce coup de main et en plus woufeil tu m'as permis d'apprendre plus de choses sur les références, les tableaux et les hash et j'ai découvert le module Dumper donc ça n'aura pas servi à rien!

    Sinon j'avais lu que Perl était un langage TIMTOWTDI et bien je comprends déjà mieux maintenant avec les tableaux et les hash

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 29/12/2009, 08h02
  2. Mon programme ne marche pas !
    Par Robmilou dans le forum Débuter
    Réponses: 3
    Dernier message: 23/10/2007, 18h39
  3. Réponses: 3
    Dernier message: 16/04/2007, 17h01
  4. Mon programme ne marche pas aprés le if:?
    Par mitherkiller dans le forum C
    Réponses: 28
    Dernier message: 28/03/2007, 19h47
  5. Sos mon programme ne marche pas
    Par monalisa_dulouvre dans le forum C
    Réponses: 49
    Dernier message: 26/12/2006, 18h35

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