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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    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
    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 !

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

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    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.

  3. #3
    Membre éprouvé
    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
    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 ?

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

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    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?

  5. #5
    Membre éprouvé
    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
    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é.

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

    Informations professionnelles :
    Activité : Bioinformaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2006
    Messages : 3 157
    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?

+ 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