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 :
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
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;
et d'obtenir
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 $xml->balise("contenu");
dans ce cas là, cela marche très bien.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 <balise>contenu</balise>
Mais dans le cas suivant :
cela marche beaucoup moins bien.
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__
et si j'inverse mes declaration de variables, j'ai :
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>
Ce qui n'est toujours pas le resultat voulu.
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>
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
Partager