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ébutant] Tableaux vs table de hash


Sujet :

Langage Perl

  1. #1
    Membre expérimenté
    Avatar de Rakken
    Homme Profil pro
    Inscrit en
    Août 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 257
    Points : 1 341
    Points
    1 341
    Par défaut [Débutant] Tableaux vs table de hash
    Bonjour,
    J'ai un ptit problème de syntaxe au niveau des tableaux/table de hash en perl.

    En php, on peut écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $tab[1] = 'test';
    $tab['deux'] = 'test2';
    echo ($tab[1] . ' ' . $tab['deux']);
    Ou encore
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $tab[0][0] = 1;
    $tab[0][1] = 2;
    $tab[1][0] = 3;
    $tab[1][1] = 4;
    $tab[0][0]['troisiemedimension'] = 5;
    Bref, un tableau s'ecrit avec un $, comme toute les variables, et on sait combien il y a de dimension avec le nombre de [] qui suivent. La clef du tableau peut être indiférement du texte ou des nombres. Il n'y a aucune différence de notion entre tableau (sous entendu à une seule dimension + index numérique implicite), table de hash (sous entendu association entre une clef explicite (texte ou numérique) et la valeur), et tableau de tableau (sous entendu tableau à plus de 2 dimension).

    Bref, c'est avec ca que j'ai l'habidute de travailler. Mais là, on me demande de réaliser un programme en perl, avec des tableaux, et je m'y perd.
    En vrac j'ai vu des $ avec des {}, des @, des %, des trucs du genre $tab->{'val'}, ou @tab[0], voire %tab[0] et même $tab{'test'}, toutes ces expressions donnant des résultats plus ou moins heureux suivant les cas.

    Bref, si quelqu'un connait un bon tuto qui explique les tableaux (au sens large) en perl, à la fois simple et très complet, qui passe en revu les diverses manière de créer des tableaux, comment les lire (affichage complet et accès à une donnée en particulier), quelles sont les relations entre les $, @ et %, et quand on peut utiliser telle ou telle clef, ca le ferai carement
    Je dois avouer qu'actuellement, c'est franchement embrouillé dans ma tête. J'ai l'impression qu'il existe 15 000 syntaxes pour écrire la même chose, et que je les mélanges toutes entres elle.

    Bref, merci d'avance pour vos éclaircissements !
    Rakken

    Oneira, un monde imaginaire d'Heroic Fantasy.

    Parce que la présomption d'innocence est un des fondements de notre pays et qu'elle doit le rester, dans tous les domaines : http://www.laquadrature.net/

  2. #2
    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
    C'est vrai qu'avec les différentes syntaxes possibles il y a de quoi s'y perdre.
    Voici un tutorial qui m'a été très utile.
    Il y a également la FAQ qui contient les bases (listes, listes associatives et références) par lesquelles tu devrais commencer. Bon courage.


    Perl6 s'annonce plus simple à ce niveau.
    -- Jasmine --

  3. #3
    Membre expérimenté
    Avatar de Rakken
    Homme Profil pro
    Inscrit en
    Août 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 257
    Points : 1 341
    Points
    1 341
    Par défaut
    Hummm... Ca m'aide, mais ca ne suffit visiblement pas.
    Prenons un exemple concret :
    J'ai une table de hash qui contient :

    Code perl : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #affiché avec : print Data::Dumper->Dump([\@hashTable], ['*hashTable']);
    @hashTable = (
                   {
                     'COL2' => '123',
                     'C1' => 'chaine de caractere'
                   }
                 );

    Cette table a été remplie suite a une lecture dans une base de donnée.
    Si j'ai tout suivit, pour afficher le contenu de la colone COL2 (genre 123) je fais :
    Code perl : Sélectionner tout - Visualiser dans une fenêtre à part
    print @hashTable{'COL2'};

    Maintenant, je voudrai realiser une fonction d'affichage de ma table de hash. Je ne sais pas, à priori, quel est le nom de mes clefs, quelle est la syntaxe qui va bien ?
    Rakken

    Oneira, un monde imaginaire d'Heroic Fantasy.

    Parce que la présomption d'innocence est un des fondements de notre pays et qu'elle doit le rester, dans tous les domaines : http://www.laquadrature.net/

  4. #4
    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
    Il est vraiment étrange ton tableau, ne peux-tu pas en récupérer un plus simple tel que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    my %hashTable = ('COL2' => '123',
                     'C1' => 'chaine de caractere');
     
    print $hashTable{'COL2'};
    Maintenant, je voudrai realiser une fonction d'affichage de ma table de hash. Je ne sais pas, à priori, quel est le nom de mes clefs, quelle est la syntaxe qui va bien ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    foreach my $k (keys %hash){
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    foreach my $val (@array){
     
    }
    et dans le cas de tableaux complexes pour savoir si ta référence pointe vers un hash ou un array, il existe la fonction ref()


    Cette table a été remplie suite a une lecture dans une base de donnée.
    Peux-tu montrer le code qui a permis de le remplir?
    -- Jasmine --

  5. #5
    Membre expérimenté
    Avatar de Rakken
    Homme Profil pro
    Inscrit en
    Août 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 257
    Points : 1 341
    Points
    1 341
    Par défaut
    En fait, je suis entrain de tenter de creer une classe singleton pour interroger une base de donnée.
    J'ai une premiere classe Db qui contient les infos de connexion et qui crée la connexion proprement dite. Elle possède une méthode execute qui fait un prepare et un execute de la requete, et ce qui m'est renvoyé, je le passe a une seconde classe, "recordset", que j'instancie pour l'occasion.

    Donc, voici les fonctions prepare et execute (de la premiere classe) :
    Code perl : 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
    # Private :
    # Cette fonction prepare une requete oracle.
    # @param string $requete : la requete que l'on souhaite executer.
    # @return
    sub _prepare {
        my ($this, $requete) = @_;
        my $reqPrepare = false;
        if (defined($this)) {
            $reqPrepare = $gl_connexion->prepare($requete);
            testDbErreur("Erreur de preparation de la requete [$requete]");
        } else {
            testDbErreur("Erreur : connexion a la base de donnee non initialisee", true);
        }
        return ($reqPrepare);
    }
     
     
     
    #
    # Fonction a appeler si on veut lancer une requete.
    # @param string $requete : la requete que l'on veut executer.
    # @return recordset : la liste des resultats.
    sub execute {
        my($this, $requete) = @_;
        $gl_log->debug("Execution d'une requete : $requete");
        my $prepareRequete = $this->_prepare($requete);
        $prepareRequete->execute();
        testDbErreur("Erreur d'execution de la requete [$requete]");
        my $rs = Recordset->new($prepareRequete);
        return($rs);
    }

    Et pour le recordset :
    Code perl : 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
     
    sub new() {
        ($classe, $sth) = @_;
        print ("new Recordset\n");
        my @tableau = $sth->fetchrow_hashref();
        Utils->printHashTable(@tableau);
        $this = {
            'sth' => $sth,
            'tableau' => @tableau[0],
            'fin' => 0,
        };
        #print Data::Dumper->Dump([\@tableau], ['*tableau']);
        print ($this->{tableau}{'C1'});
        print ("end new Recordset\n");
        return(bless($this, $classe));
    }

    Toujours dans la classe Recordset, j'ai également un next() pour passer à l'enregistrement suivant, un fin(), pour savoir si je suis arrivé en fin de lecture, et un champ() qui me donne le contenu du champ.

    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
    #
    # Cette methode retourne le contenu d'un champ.
    sub champ() {
        ($classe, $champ) = @_;
        return ($classe->{tableau}{$champ});
    }
     
    #
    # Cette method fait un fetch et passe au tuple suivant.
    sub next() {
        ($this) = @_;
     
        my @tab = $this->{'sth'}->fetchrow_hashref();
        $this->{'tableau'} = @tab[0];
        if ($this->{'tableau'} == undef) {
            $this->{'fin'} = 1;
        }
    }
     
    #
    # Cette methode renvoie true si on est arrive a la fin du fetch, false sinon.
    # @return boolean : true s'il reste des enregistrements a fetcher, false sinon.
    sub fin() {
        return ($this->{'fin'});
    }
    Et pour des raisons de debug essentiellement, j'aimerai me creer une fonction listeChamp() qui m'affiche la liste des champs que je peux interroger avec ma fonction champ();
    Pour info, même s'il n'est pas nécessairement très propre (par méconnaissance du langage), le code fonctionne plutot bien.

    A l'utilisation ca donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $db = Db->getInstance($dbName, $user, $pswd);
    $rs = $db->execute('select col1 as c1, col2 from test');
    while (!$rs->fin()) {
    	print " C1=" . $rs->champ('C1') . "\n";
    	print " C2=" . $rs->champ('COL2') . "\n";
    	$rs->next();
    }
    Ce qui était le but recherché.
    Rakken

    Oneira, un monde imaginaire d'Heroic Fantasy.

    Parce que la présomption d'innocence est un des fondements de notre pays et qu'elle doit le rester, dans tous les domaines : http://www.laquadrature.net/

  6. #6
    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
    ... désolée mais je ne m'y connais pas en OO, je ne peux pas beaucoup t'aider.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        my @tableau = $sth->fetchrow_hashref();
        Utils->printHashTable(@tableau);
        $this = {
            'sth' => $sth,
            'tableau' => @tableau[0],
            'fin' => 0,
        };
        #print Data::Dumper->Dump([\@tableau], ['*tableau']);

    $sth->fetchrow_hashref(); renvoie un référence que tu dois donc récupérer dans un scalaire ($)

    Ton $this est un tableau, tu devrais le déclarer avec un % où alors créer une référence (scalaire $) vers ton tableau % (my $this = \%tableau). Mais vu que $this est spécial en OO, je ne sais pas ce que tu dois en faire.

    @tableau[0] est mieux écrit sous la forme $tableau[0]



    ... utilises-tu les pragmas stricts et warnings?
    -- Jasmine --

  7. #7
    Membre expérimenté
    Avatar de Rakken
    Homme Profil pro
    Inscrit en
    Août 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 257
    Points : 1 341
    Points
    1 341
    Par défaut
    Ton $this est un tableau, tu devrais le déclarer avec un % où alors créer une référence (scalaire $) vers ton tableau % (my $this = \%tableau). Mais vu que $this est spécial en OO, je ne sais pas ce que tu dois en faire.
    Humm, j'ai déjà vu passer le mot "référence" dans certains tuto, mais je ne saisis pas bien ce que c'est. Ca a tendance a m'évoquer les * et autres & en C pour passer des pointeurs sur les variables plutot que les variables elle même, c'est pareil ?

    @tableau[0] est mieux écrit sous la forme $tableau[0]
    Tableau est un tableau, pourquoi mettre $ à la place de @ ? (j'imagine que la réponse viendra naturellement avec la réponse à la question d'au dessus, mais pour l'instant, c'est flou).


    ... utilises-tu les pragmas stricts et warnings?
    Ne sachant pas ce que c'est, je pense que non, mais s'il y a moyen d'afficher plein de warnings pour me guider et "m'obliger" à faire propre, je prend !
    Rakken

    Oneira, un monde imaginaire d'Heroic Fantasy.

    Parce que la présomption d'innocence est un des fondements de notre pays et qu'elle doit le rester, dans tous les domaines : http://www.laquadrature.net/

  8. #8
    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 Rakken Voir le message
    Humm, j'ai déjà vu passer le mot "référence" dans certains tuto, mais je ne saisis pas bien ce que c'est. Ca a tendance a m'évoquer les * et autres & en C pour passer des pointeurs sur les variables plutot que les variables elle même, c'est pareil ?
    C'est expliqué dans la FAQ, références?


    Citation Envoyé par Rakken Voir le message
    Tableau est un tableau, pourquoi mettre $ à la place de @ ? (j'imagine que la réponse viendra naturellement avec la réponse à la question d'au dessus, mais pour l'instant, c'est flou).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    @liste = ('un', 'deux');
    # élément 1
    $list[0];   # contient un
    # élément 2
    $list[1];  # contient deux
    C'est parce que ta liste est composée d'un ensemble de scalaires auxquels on accède via le dollar. C'est également expliqué dans la FAQ (chapitre sur les listes)

    Citation Envoyé par Rakken Voir le message
    Ne sachant pas ce que c'est, je pense que non, mais s'il y a moyen d'afficher plein de warnings pour me guider et "m'obliger" à faire propre, je prend !
    Il te suffit de rajouter au début du script
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #!/usr/local/bin/perl
     
    use strict;
    use warnings;
     
    # suite du code
    Mais je te préviens que perl ne va pas être content, que ton code ne fonctionnera plus et que tu auras probablement une longue liste d'erreurs qui va apparaitre.
    -- Jasmine --

  9. #9
    Membre expérimenté
    Avatar de Rakken
    Homme Profil pro
    Inscrit en
    Août 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 257
    Points : 1 341
    Points
    1 341
    Par défaut
    Ah, nickel, cette faq !
    Effectivement, pour comprendre les tableaux & co, il ne fallait pas chercher des tutos sur les tableaux, mais sur les références ! (cherchez l'erreur )

    Bon, je vais me la relire une bonne dizaine de fois, faire des tests, et si tout se passe bien, ce soir j'aurai compris comment ca marche ;-))
    Rakken

    Oneira, un monde imaginaire d'Heroic Fantasy.

    Parce que la présomption d'innocence est un des fondements de notre pays et qu'elle doit le rester, dans tous les domaines : http://www.laquadrature.net/

  10. #10
    Membre expérimenté
    Avatar de Rakken
    Homme Profil pro
    Inscrit en
    Août 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 257
    Points : 1 341
    Points
    1 341
    Par défaut
    Ok, avec tes explications et les liens que tu m'as filé, j'y vois enfin plus clair.
    Juste pour mémoire, le code qui n'affiche que les clefs de ma hash table, sachant que je stockai une référence :
    Code perl : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    	foreach $val (keys %$ref_tab){
    		print ('listeChamp:' . $val . "\n");
    	}

    Merci pour ton aide ;-)
    Rakken

    Oneira, un monde imaginaire d'Heroic Fantasy.

    Parce que la présomption d'innocence est un des fondements de notre pays et qu'elle doit le rester, dans tous les domaines : http://www.laquadrature.net/

  11. #11
    Membre expérimenté
    Avatar de Rakken
    Homme Profil pro
    Inscrit en
    Août 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 257
    Points : 1 341
    Points
    1 341
    Par défaut
    Je me permet de completer ce post avec un exemple simple et clair pour créer une table de hash et accéder à ses éléments :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    %var = (
    		'clef1' => {
    			'clef11' => 'valeur11',
    			'clef12' => 'valeur12'
    		},
    		'clef2' => {
    			'clef21' => 'valeur21'
    		}
    );
     
    print ($var{'clef1'}{'clef11'});
    ==> Affiche "valeur11"
    Eventuellement à rajouter dans la faq, j'aurai été heureux à l'époque avec ca.
    Rakken

    Oneira, un monde imaginaire d'Heroic Fantasy.

    Parce que la présomption d'innocence est un des fondements de notre pays et qu'elle doit le rester, dans tous les domaines : http://www.laquadrature.net/

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

Discussions similaires

  1. table, liste, hash et tout et tout.. pour débutant
    Par Eric5959 dans le forum Langage
    Réponses: 22
    Dernier message: 01/08/2008, 09h16
  2. [débutant] relier deux tables
    Par benoitB dans le forum Débuter
    Réponses: 4
    Dernier message: 27/06/2005, 14h04
  3. [débutant] import de table
    Par viny dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 03/03/2005, 12h24
  4. Réponses: 3
    Dernier message: 11/01/2005, 08h20
  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