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:
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:
1 2
|
$xml->balise("contenu"); |
et d'obtenir
Code:
1 2
|
<balise>contenu</balise> |
dans ce cas là, cela marche très bien.
Mais dans le cas suivant :
Code:
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:
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:
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