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

Modules Perl Discussion :

Petit problemes de variables avec des Packages


Sujet :

Modules Perl

  1. #1
    Invité
    Invité(e)
    Par défaut Petit problemes de variables avec des Packages
    Bonjour à tous,

    Je suis en train de coder un petit package pour me faire des modules xml, et je fait donc, une espece d'encapsulation de l'xml pour avoir moins de choses à écrire. Voici mon 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
    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
    #!/usr/bin/perl
     
    package XMLGen;
     
    use strict;
     
    use vars qw( $AUTOLOAD $ARGS );
     
    {
     
    sub new {
       my ( $caller, $arg ) = @_;
       my $class = ref($caller) || $caller;
       my $ego = bless {}, $class;
     
    # Si $arg vaux 1, cela veux dire que mes balises html auront des options <bal plop="">
    # qui seront le dernier argument de la fonction.
       $ARGS = 0;
       $ARGS = 1 if ($arg);
     
       return $ego;
    }
     
    sub AUTOLOAD {
       no strict 'refs';
       my ( $ego, @text ) = @_;
     
       $AUTOLOAD =~ /^.+::(\w+)$/;
     
       my $attribute = $1;
     
       *{$AUTOLOAD} = 
          sub {
    	 my ( $var, $arguments ) = ( '', '' );
     
    	 $arguments = ' '.pop( @text ) if ($ARGS);
     
    	 for (@text) {
    	    $var .= '<'.$attribute.$arguments.'>'
    			   .$_
    		   .'</'.$attribute.">\n";
    	 }
     
    	 return $var;
          };
     
       &{$AUTOLOAD};
    }
     
    sub DESTROY { 1 }
     
    }
     
    1;
    rien de bien original, je vous l'accorde. Le but du jeu est de pouvoir ecrire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $xml->balise("contenu");
    et d'obtenir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <balise>contenu</balise>
    dans ce cas là, cela marche très bien.

    Mais dans le cas suivant :

    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
     
    #!/usr/bin/perl
     
    use strict;
    use warnings;
     
    use XMLGen;
     
    my $cm = XMLGen->new(0);
    my $am = XMLGen->new(1);
     
    print 
    $cm->html( 
       $cm->head( $cm->title("test") )
       .$cm->ul( $cm->li( "item1", 
    		      "item2", 
    		      "item3")));
     
     
    print $am->plop("toto", "tata", 'text="blue"');
     
    __END__
    cela marche beaucoup moins bien.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    %perl test.pl
    <plop text="blue">toto</plop>
    <plop text="blue">tata</plop>
    et si j'inverse mes declaration de variables, j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    %perl test.pl
    <html><head><title>test</title>
    </head>
    <ul><li>item1</li>
    <li>item2</li>
    <li>item3</li>
    </ul>
    </html>
    <plop>toto</plop>
    <plop>tata</plop>
    <plop>text="blue"</plop>
    Ce qui n'est toujours pas le resultat voulu.

    Donc, en 2 mots, comment faire pour avoir 2 objets distincts quand je manipule des references comme ceci ?

    Merci d'avance pour vos réponses

  2. #2
    Membre éprouvé Avatar de MarneusCalgarXP
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    911
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 911
    Points : 1 118
    Points
    1 118
    Par défaut
    pour moi, le résultat correspond bien au code... que veux tu obtenir exactement ?

    Je ne répond à aucune question technique par MP.

    Si votre problème est réglé, n'oubliez pas Dans tous les cas

  3. #3
    Membre éprouvé Avatar de MarneusCalgarXP
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    911
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 911
    Points : 1 118
    Points
    1 118
    Par défaut
    Attention, le code de ta "classe" a un petit problème: la variable $ARGS est commune à toutes les instances de l'objet !

    je te conseille plutot un truc dans le style:

    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
     
    #!/usr/bin/perl
     
    package XMLGen;
     
    use strict;
    use vars qw( $AUTOLOAD);
     
    sub new {
       my ( $caller, $arg ) = @_;
       my $class = ref($caller) || $caller;
       my $self = {};
       $self->{ARGS} = $arg;
       bless ($self, $class);
       return $self;
    }
     
    sub AUTOLOAD {
       no strict 'refs';
       my ( $self, @text ) = @_;
     
       $AUTOLOAD =~ /^.+::(\w+)$/;
     
       my $attribute = $1;
     
       *{$AUTOLOAD} = 
          sub {
    	 my ( $var, $arguments ) = ( '', '' );
     
    	 $arguments = ' '.pop( @text ) if ($self->{ARGS});
     
    	 for (@text) {
    	    $var .= '<'.$attribute.$arguments.'>'
    			   .$_
    		   .'</'.$attribute.">\n";
    	 }
     
    	 return $var;
          };
     
       &{$AUTOLOAD};
    }

    Je ne répond à aucune question technique par MP.

    Si votre problème est réglé, n'oubliez pas Dans tous les cas

  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
    C'est parce que $ARGS est une variable globale, et non propre à chaque objet...
    Dans ton premier exemple $ARGS est donc à 1 après les déclarations de $cm et $am, regarde donc bien ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    	 $arguments = ' '.pop( @text ) if ($ARGS);
     
    	 for (@text) {
    	    $var .= '<'.$attribute.$arguments.'>'
    			   .$_
    		   .'</'.$attribute.">\n";
    	 }
    Dans ta première fonction @text n'a qu'un élément, et donc 0 après le pop, donc on ne passe pas dans la boucle for...

    Il faut que $ARGS soit spécifique à chaque instance de ta classe, donc que tu le mette dans le hash qui représente l'objet.

    (par ailleurs je trouve un peu casse-gueule de faire ça... Je pense qu'il serait préférable de revoir l'interface de ta fonction, style on peut toujours passer des arguments supplémentaires, mais on appelle la fonction en lui fournissant une référence de tableau (pour les contenus) et une référence de hash (pour les attributs).

    --
    Jedaï

  5. #5
    Invité
    Invité(e)
    Par défaut
    Et bien merci, j'avais pas fait gaffe, c'est vrai que c'est un peu bête comme erreur...

    Pour l'histoire de modifier mes args pour un tableau et un hash, je crois que je vais faire comme ça, d'une ça sera plus simple, et peut-etre plus pratique

Discussions similaires

  1. Probleme de syntaxe avec des calculs integrant des variables
    Par trigger00 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 30/06/2009, 09h20
  2. [PHP-JS] Probleme de test avec des variables
    Par bodysplash007 dans le forum Langage
    Réponses: 1
    Dernier message: 02/05/2007, 17h39
  3. Probleme de boucle avec des processus sous UNIX
    Par sebastieng dans le forum POSIX
    Réponses: 6
    Dernier message: 15/10/2005, 18h57
  4. petit souci avec des variables avec des fonctions psql
    Par dust62 dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 02/04/2005, 13h45
  5. Réponses: 6
    Dernier message: 04/04/2003, 15h28

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