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