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 :

Reference a un tableau


Sujet :

Langage Perl

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 26
    Points : 25
    Points
    25
    Par défaut Reference a un tableau
    Bonjour,
    J'ai ecrit une fonction qui retourne un tableau, par le biais d'une reference $self.

    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
     
    use strict;
    use warnings "all";
     
    sub subject
    	{
    	my ($class,$file) = @_;	
    	my $self = {};
     
    	my $line;	
    	my $i = 0;
     
    	bless ($self, $class);
    	open (LISTSUBJ, "$file") or die "\nCannot open the subjects file\n";
    	while( $line = <LISTSUBJ> )
    			{if($line =~ /("[a-z]{2,30}) ([a-z]{2,30})" (\w{4,6}) ([0-9]{6}) ([0-9]{1,2}) ([0-9]{1,2})/)
    				{${$self->{LIST_ID}}[$i] = $4;}
    			$i++;
    			}
    	close (LISTSUBJ);
    	return $self;
    	}
    1;
    Lorsque j'utilise ma fonction, elle me retourne en effet le tableau desire (il s'agit pour information d'une liste de chiffres, sans chaine de caractere) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    print "\n".Dumper(List_subjects->subject($subjfile))."\n";
    Je souhaite balayer ce tableau en question (foreach), par consequent lire chacune des valeurs qui y sont presentes.
    Comment faire ?
    Pouvez vous m'aider SVP.

    Djahny.

  2. #2
    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
    Comme tu sembles vouloir utiliser des objets, je te propose une solution sous forme de méthode prenant un callback en paramètre (callback à appeler pour chaque élément de ton tableau, avec le premier argument valant l'objet, et le second l'élément courant).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    sub tour {
      my( $self, $code ) = @_;
      foreach my $elt ( @{$self->{LIST_ID}} ) {
        $code->( $self, $elt );
      }
    }
    A appeler ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    # affiche la liste des éléments, un par ligne
    $subject->tour( sub { print "$_[1]\n"; } );
    Par ailleurs, tu pourrais simplifier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ${$self->{LIST_ID}}[$i] = $4;
    en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $self->{LIST_ID}[$i] = $4;
    --
    Jedaï

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 26
    Points : 25
    Points
    25
    Par défaut
    Merci pour la reponse.
    Mais j'ai du mal a comprendre comment tu appelles la fonction.

    Code :

    # affiche la liste des éléments, un par ligne
    $subject->tour( sub { print "$_[1]\n"; } );
    (je ne veux pas afficher les elements ligne par ligne, je souhaite juste les recuperer pour les utiliser)

    Dois je integrer la fonction "tour' a mon package "List_subjects" comme suit ?

    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
     
    #! /usr/bin/env perl
     
    package List_subjects;
     
    use strict;
    use warnings "all";
     
    sub subject
    	{
    	my ($class,$file) = @_;	
    	my $self = {};
     
    	my $line;	
    	my $i = 0;
     
    	bless ($self, $class);
    	open (LISTSUBJ, "$file") or die "\nCannot open the subjects file\n";
    	while( $line = <LISTSUBJ> )
    			{if($line =~ /("[a-z]{2,30}) ([a-z]{2,30})" (\w{4,6}) ([0-9]{6}) ([0-9]{1,2}) ([0-9]{1,2})/)
    				{$self->{LIST_ID}[$i] = $4;}
    			$i++;
    			}
    	close (LISTSUBJ);
    	return $self;
    	}
     
    sub tour
    	{
      	my ($self,$code) = @_;
      	foreach my $elt ( @{$self->{LIST_ID}} ) 
    		{$code->( $self, $elt );}
    	}
     
    1;
    Dans ce cas, comment faire pour utiliser les deux fonctions ? En effet, la fonction "List_subjects->subject" permet de pointer mon tableau, et la fonction "List_subjects->tour' (que tu m'as propose) receuillir les donnees de ce tableau.

    Djahny.

  4. #4
    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 Djahny
    Mais j'ai du mal a comprendre comment tu appelles la fonction.
    (je ne veux pas afficher les elements ligne par ligne, je souhaite juste les recuperer pour les utiliser)
    Tu peux mettre n'importe quelle fonction en paramètre de tour(), par exemple pour faire la somme des nombres :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    my $subject = List_subjects->subject($subjfile);
     
    my $sum = 0;
    $subject->tour( sub { $sum += $_[1] } );
     
    print "Somme : $sum\n";

    Est-ce que tu as bien compris que tu étais en train de faire du Perl objet ?
    --
    Jedaï

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 26
    Points : 25
    Points
    25
    Par défaut
    Oook

    Mais, cela ne resoud pas mon probleme. Je veux recuperer UN element de ma liste et non la liste entiere.

    Djahny.

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 26
    Points : 25
    Points
    25
    Par défaut
    Ben, je pense avoir trouve la solution.
    Il fallait simplement retourner "@{$self->{LIST_ID}}" au lieu "$self". Ainsi, je peux acceder au n'importe quelle valeur de tableau.

    Djahny.

  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 Djahny
    Je souhaite balayer ce tableau en question (foreach), par consequent lire chacune des valeurs qui y sont presentes.
    Comment faire ?
    Pouvez vous m'aider SVP.

    Djahny.
    puis

    Citation Envoyé par Djahny
    Mais, cela ne resoud pas mon probleme. Je veux recuperer UN element de ma liste et non la liste entiere.
    ...

    Ben faut savoir, moi j'étais parti de l'idée que tu avais besoin d'itérer sur le contenu de ton objet.
    S'il s'agit juste de récupérer une des valeurs, j'imagine que tu peux faire quelque chose comme ça :
    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
    package List_subjects;
    use strict;
    use warnings "all";
     
    sub subject {
        my ( $class, $file ) = @_;
        my $self = {};
     
        bless( $self, $class );
        open( my ($list_subjects), '<', $file )
          or die "\nCannot open the subjects file $file : $!\n";
        while ( my $line = <$list_subjects> ) {
            if (
                $line =~ m/("[a-z]{2,30}) \s
                ([a-z]{2,30})" \s 
                (\w{4,6}) \s 
                ([0-9]{6}) \s 
                ([0-9]{1,2}) \s 
                ([0-9]{1,2})/x
              )
            {
                $self->{LIST_ID}[ $. - 1 ] = $4;
            }
        }
        close(LISTSUBJ);
        return $self;
    }
     
    sub tour {
        my ( $self, $code ) = @_;
        foreach my $elt ( @{ $self->{LIST_ID} } ) { $code->( $self, $elt ); }
    }
     
    sub get_size {
        my $self = shift;
        return scalar @{ $self->{LIST_ID} };
    }
     
    sub get_id {
        my ($self, $idx ) = @_;
        return $self->{LIST_ID}[$idx];
    }
     
    1;
     
    __DATA__
    --
    Jedaï

  8. #8
    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 Djahny
    Ben, je pense avoir trouve la solution.
    Il fallait simplement retourner "@{$self->{LIST_ID}}" au lieu "$self". Ainsi, je peux acceder au n'importe quelle valeur de tableau.

    Djahny.
    Ok... Donc tu ne faisais pas exprès de créer un objet, tu avais copié-collé du code sans le comprendre. Il fallait le dire tout de suite, si tu ne veux pas faire d'objet il est inutile de s'embêter à le construire pour l'oublier tout de suite après :
    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
    package List_subjects;
    use strict;
    use warnings "all";
     
    use base 'Exporter';
    our @EXPORT = qw( subject );
     
    sub subject {
        my $file = shift;
        my @subjects;
     
        open( my ($list_subjects), '<', $file )
          or die "\nCannot open the subjects file $file : $!\n";
        while ( my $line = <$list_subjects> ) {
            if (
                $line =~ m/("[a-z]{2,30}) \s
                ([a-z]{2,30})" \s 
                (\w{4,6}) \s 
                ([0-9]{6}) \s 
                ([0-9]{1,2}) \s 
                ([0-9]{1,2})/x
              )
            {
                # cette ligne me paraît légèrement étrange, veux tu vraiment 
                # des cases vides dans ton tableau si une ligne ne 
                # correspond pas à la regex ?
                $subjects[ $. - 1 ] = $4;
            }
        }
        close($list_subjects);
        return @subjects;
    }
     
    1;
    Et ensuite tu l'utilises simplement ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    use List_subjects;
     
    my @subjects_list = subject('nom_de_fichier');
    Plus simple non ?

    --
    Jedaï

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 26
    Points : 25
    Points
    25
    Par défaut
    Je suis desole mais je pense avoir ete clair lorsque j'ai expose mon probleme.

    Ok... Donc tu ne faisais pas exprès de créer un objet, tu avais copié-collé du code sans le comprendre.
    Le code que je t'ai presente la premiere fois, je l'ai ecrit seul, avec comme seul support le cours d'Introduction sur Perl de Sylvain Lhullier (que tu as toi meme propose), etant debutant dans ce langage de programmation.

    Enfin, pourquoi ma maniere de faire n'est elle pas bonne ?
    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
     
    package List_subjects;
     
    ### This package lists the ID of subjects. 
     
    use strict;
    use warnings "all";
     
    sub subject
    	{
    	my ($class,$file) = @_;	
    	my $self = {};
     
    	my $line;	
    	my $i = 0;
     
    	bless ($self, $class);
    	open (LISTSUBJ, "$file") or die "\nCannot open the subjects file\n";
    	while( $line = <LISTSUBJ> )
    			{if($line =~ /"([a-z]{2,30}) ([a-z]{2,30})" (\w{4,6}) ([0-9]{6}) ([0-9]{1,2}) ([0-9]{1,2})/)
    ## j'ai applique ceci, apres lecture du cours de Sylvain Lhullier
    				{$self->{LIST_ID}[$i] = $4;}
    			$i++;
    			}
    	close (LISTSUBJ);
     
    	return @{$self->{LIST_ID}};
    	}
     
    1;
    Par la suite, j'accede aux valeurs de mon tableau:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    my @bidule = List_subjects->subject($subjfile);
    print "$bidule[15]\n"; #et ca s'affiche donc c'est correct
    Djahny.

  10. #10
    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 Djahny
    Le code que je t'ai presente la premiere fois, je l'ai ecrit seul, avec comme seul support le cours d'Introduction sur Perl de Sylvain Lhullier (que tu as toi meme propose), etant debutant dans ce langage de programmation.
    Je doute fort que ce cours t'incite à créer du code objet juste pour retourner un tableau à la fin. Tu es sans doute allé trop loin, trop vite, et tu ne comprends pas vraiment ce que tu es en train de faire. Evite le Perl objet tant que tu ne contrôle pas parfaitement la base.

    Citation Envoyé par Djahny
    Enfin, pourquoi ma maniere de faire n'est elle pas bonne ?
    Elle marche, simplement $self ne sert à rien, tu crées donc un objet (référence bénie avec bless()) contenant un hash comportant une seule entrée (donc inutile), le tout pour stocker le tableau que tu vas finalement renvoyer, mais sans conserver ni ton objet, ni ton hash...
    Lorsque tu reliras ce code dans trois mois tu te demanderas pourquoi tu avais créé un objet, où il était passé, quels étaient censé être les autres clés du hash, etc ? En bref tu auras beaucoup de mal à comprendre ce que tu essayais de faire. Il est préférable de faire au plus simple pour favoriser la relecture ultérieure de ton code.

    --
    Jedaï

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 26
    Points : 25
    Points
    25
    Par défaut
    Ok, je comprend. Je me suis effectivement lance dans le Perl objet pensant que c'etait l'ideal pour ce que je souhaitais faire.
    Je suis la pour apprendre, pas plus vite que ce qui m'est possible. Etant debutant en Perl (a chacun sa specialite), il est vrai que je fais des erreurs, notamment dans la maniere d'aborder un probleme...

    Voila, une erreur que je ne commettrai plus

    Merci pour tout .
    Djahny.

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

Discussions similaires

  1. Affichage reference figure et tableau
    Par Stephane38 dans le forum Tableaux - Graphiques - Images - Flottants
    Réponses: 1
    Dernier message: 13/03/2011, 08h32
  2. Réponses: 5
    Dernier message: 27/03/2008, 14h32
  3. reference sur tableau N dimensions
    Par harsh dans le forum C++
    Réponses: 11
    Dernier message: 28/06/2006, 18h53
  4. [Perl] Pb boucle ?! ou de reference tableau ?!
    Par needles94000 dans le forum Langage
    Réponses: 4
    Dernier message: 19/01/2006, 21h32
  5. Elément d'un tableau peut-il être reférencé?
    Par scoob67 dans le forum Linux
    Réponses: 9
    Dernier message: 20/10/2005, 18h43

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