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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 26
    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 confirmé
    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
    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
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 26
    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 confirmé
    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
    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
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 26
    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
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 26
    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 confirmé
    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
    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ï

  8. #8
    Expert confirmé
    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
    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ï

+ 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