Bonjour à tous,
Pour mon premier post sur ce forum, j'ai un probleme... (je me rattraperait promis!)
Je suis en train de faire un petit logiciel qui affiche une liste de flux radio avec ncurses, les informations viennent d'un fichier XML, et lors de l'affichage de ma liste, je veux pouvoir changer l' ordre des colonnes et les informations affichées...
Je me suis dit que pour faire ca, je pouvait faire un format, mais il faut qu'il soit dynamique (en fait, il change juste au demarage), donc, j'ai un fonction qui genere un format en fonction d'une chaine :
Bon, c'est peut etre pas super optimisé, mais ca marche...
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 #!/usr/bin/perl -w # # Nouvelle version pour la generation de formats... # use strict; package Format; # definition des variables %Format::fields = ( '$server_name' => 20, '$listen_url' => 20, '$server_type' => 4, '$bitrate' => 4, '$channels' => 2, '$samplerate' => 5, '$genre' => 10, '$current_song' => 20 ); sub generate { my $buffer = shift; my $format_name = shift; my $format; my $values; # On commence par remplacer les alias $buffer =~ s/\\t/\\\{4\}/g; while ($buffer ne "") { $format .= ' 'x$1 if $buffer =~ s/^\\\{(\d+)\}//; $format .= $1 if $buffer =~ s/^(.*?)([\\\{(\d+)\}|\$\w+])/$2/; if ($buffer =~ s/^(\$\w+)//) { my $var = $1; $values .= $var.','; $format .= '@'.'<'x$Format::fields{$var}; } } chop $values; return 'format '.$format_name."=\n".$format."\n".$values."\n.\n"; } 1; __END__
ensuite, losque que je veux faire ma boucle qui affiche le contenu de l'XML, je fait ceci :
et le probleme est ici, si je fait mon eval, au debut du code, telle qu'il est mis en commentaire, il ne veux pas afficher la liste...
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 #!/usr/bin/perl -w use strict; use XML::DOM; use Format; my $test = '$server_name\t\t$genre\t$server_type'; my $format = Format::generate($test, 'STDOUT'); #eval ($format); my $file = '/home/keymaker/Projects/radio-daemon/perl/data.tmp'; my $parser = XML::DOM::Parser->new(); my $doc = $parser->parsefile($file); foreach my $flux ($doc->getElementsByTagName('entry')) { my $server_name = $flux->getElementsByTagName('server_name') ->item(0) ->getFirstChild->getNodeValue; my $genre = $flux->getElementsByTagName('genre') ->item(0) ->getFirstChild->getNodeValue; my $server_type = $flux->getElementsByTagName('server_type') ->item(0) ->getFirstChild->getNodeValue; eval ($format); write; } __END__
message d'erreur :
et si je le met la ou il est decomenté, c'est à dire juste avant le write, j'ai le droit à un warning à chaque iteration :Can't use string ("server_name") as a SCALAR ref while "strict refs" in use at (eval 56) line 3.
Comment faire ?? je tien à precisé, que je suis ouvert à toutes suggestions concernant ce code (je suis en train d'apprendre le perl, et si mon code n'est pas très rapide ou que l'oon peut faire autrement (surement), mais surtotu plsu rapide, je suis ouvert à toute proposition...)Format STDOUT redefined at (eval 57) line 1.
Merci d'avance.
Partager