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 :

Déclarer une table hash par itération


Sujet :

Langage Perl

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 9
    Points : 8
    Points
    8
    Par défaut Déclarer une table hash par itération
    Bonjour,
    Je souhaiterai déclarer une nouvelle table hash par tour de boucle.
    Je pensais mettre un compteur de type :

    $i=$i+1

    Je voulais ensuite inclure ce compteur dans le nom de mon hash :

    my %h$i

    Je voudrai obtenir %h1, %h2... jusqu'à la fin de ma boucle.

    Auriez vous une idée de la façon dont il faille l'écrire?
    D'avance merci !

  2. #2
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Les références symboliques permettent de faire cela, mais leur utilisation est dépréciée avec les versions actuelles de Perl (et ce depuis au moins une douzaine d'années).

    Il est préférable d'utiliser un hash de hashes (ou éventiellement un taleau de hashes, si tes valeurs sont toutes numérique), ave par exempole une syntaxe de e style:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $hash[$i]{'toto'} = "titi";

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 9
    Points : 8
    Points
    8
    Par défaut
    Merci pour votre réponse !
    J'ai donc essayé comme vous me l'avez conseillé, le tableau de hashes (car je n'ai que des valeurs numériques).

    Cependant quand je lui demande d'imprimer ce tableau, j'obtiens :
    HASH<0x48de10>HASH<0x4dbc10>HASH<0x4fe4f0> etc.

    Je vais essayer d'en apprendre plus sur les tableaux/hashes de hashes.

  4. #4
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Montre ton code, que l'on puisse t'aider à corriger ce qui ne va pas.

    Mon exemple précédent était un peu inconsistant. Il aurait fallu écrire soit un hash de hashes::

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $hash{$i}{'toto'} = "titi";
    soit un tableau de hashes (en supposant $i toujours numérique):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $tableau[$i]{'toto'} = "titi";
    sachant que je donne à mes variables les noms "hash" et "tableau" uniquement pour mieux clarifier leur nature dans l'exemple; dans ton vrai cas, utilise plutôt un nom spécifiant leur contenu.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 9
    Points : 8
    Points
    8
    Par défaut
    Voici mon code pour le moment :

    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
    open fichier, ">>c:/data.txt";
    my $rep = "C:/Donne";
    $i=0;
    my %f;
    opendir(REP,$rep) or die "Dossier introuvable";
    	while(defined(my $fic=readdir REP)){ 
    	$i=$i+1;
    	my $f="${rep}/$fic";
    	open FIC, "$f" or warn "$f fichier introuvable";
    		while (<FIC>){
    		chomp($_);
    		my @Tab=split("\t", $_);
    		$a=@Tab[0];
    		$b=@Tab[1];
    		$h[$i]{$a} = $b;
    		}
    	}
    Le but (dans un premier temps) est de contenir les valeurs de chaque fichier présent dans le répertoire, dans une hash.

  6. #6
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    premier conseil: utilise toujours les pragmas suivants:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    use strict;
    use warnings;
    Cela t'aider à détecter des erreurs qui tu risques de ne pas voir autrement. Par exemple, le tableau de hashes @h n'est pas déclaré (alors que tu déclares le hash %f que tu n'utilises pas).

    Deuxième point, cette syntaxe n'est pas correcte:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    		$a=@Tab[0];
    		$b=@Tab[1];
    Il faut écrire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    		$a=$Tab[0];
    		$b=$Tab[1];
    Mais il y a plus simple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    		my ($a, $b) = split("\t", $_);
    		$h[$i]{$a} = $b;
    Je réécrirais aussi les lignes 5 à 9 comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    my @liste_fic = glob ("$rep/*.*");
    foreach my $fichier(@liste_fic) {
         $i ++;
         open my $FIC, "<", "$fichier" or warn "impossible ouvrir $fichier $!";
         while (<$FIC>) { # ...
    Pour l'impression, tu de donnes pas la ligne de code qui t'a donné une erreur, mais il suffit en principe d'une instruction comme celle-ci:


  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 9
    Points : 8
    Points
    8
    Par défaut
    Merci de l'aide, j'essaye ça demain et je te donne mes résultats !

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 9
    Points : 8
    Points
    8
    Par défaut
    Bonjour,
    j'ai apporté les modifications que tu m'as recommandé, voici donc le 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
    use strict;
    use warnings;
    open fichier, ">>c:/data.txt";
    my $rep = "C:/Donne";
    $i=0;
    my %h;
    my @liste_fic = glob ("$rep/*.*");
    foreach my $fichier(@liste_fic) {
         $i ++;
         open my $FIC, "<", "$fichier" or warn "impossible ouvrir $fichier $!";
    		while (<FIC>){
    		chomp($_);
    		my ($a,$b)=split("\t", $_);
    		$h[$i]{$a} = $b;
    		}
    	}
    print $h[1]{350};
    En exécutant ce script, j'obtiens le message d'erreur suivant :

    Global symbol "$i" requires explicit package name at c:\tr.pl line 5.
    BEGIN not safe after errors--compilation aborted at c:\tr.pl line 7.

  9. #9
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Ta variable $i n'est pas déclarée (ce qui est nécessaire avec le pragma 'use strict' que je t'ai conseillé. Change simplement la ligne 5 de ton code ci-dessus comme suit:

    Tant que j'y suis, je vois au moins une seconde erreur entre les lignes 10 et 11:
    - tu ouvres le descripteur de fichier $FIC en ligne 10
    - tu utilises le descripteur de fichier FIC en ligne 11. Change la ligne 11 comme suit:

    Tu auras sans doute un problème analogue avec %h, car h est un tableau de hashes (plus exactement un tableau de références vers des hash anonymes, mais, bon, ça veut dire la même chose), donc d'abord un tableau, et devrait donc être déclaré comme: "my @h;".

    Le reste paraît correct à vue de nez, mais je te conseillerais d'utiliser des noms de variables plus parlants. Par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my ($a,$b)=split("\t", $_);
    n'est pas très explicite. Ton code serait bien mieux auto-documenté si tu remplaçais $a et $b par des noms de variables décrivant le contenu de ces variables (comme je l'ai fait dans le code que j'ai proposé: "$fichier(@liste_fic)...", c'est bien plus clair que l'on examine chaque fichier d'une liste de fichiers). Idem pour "@h".

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 9
    Points : 8
    Points
    8
    Par défaut
    Alors, déjà merci beaucoup pour ton aide, ça m'a permis de finir mon petit script, tout marche comme je le voulais !
    Je vais changer les noms de mes variables histoires de m'y retrouver, comme tu me le conseil, et je pourrai passer à autre chose

    Un grand merci !

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

Discussions similaires

  1. [MySQL] modifier les enregistrement d'une table mysql par un formulaire
    Par belakhdarbts10 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 15/05/2007, 11h09
  2. Inersert dans une table crée par les cardinalités [*,*]
    Par drasalmed dans le forum Langage SQL
    Réponses: 2
    Dernier message: 06/05/2007, 18h27
  3. déclarer une table dans une fonction SQL
    Par bicho dans le forum VB.NET
    Réponses: 3
    Dernier message: 19/03/2007, 14h11
  4. Réponses: 6
    Dernier message: 15/05/2006, 17h04
  5. aditionner les champs d'une table ligne par ligne
    Par bertrand_declerck dans le forum Bases de données
    Réponses: 3
    Dernier message: 09/08/2005, 08h38

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