Bonjour,

j'ai un fichier xml:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
<?xml version='1.0' encoding='utf-8'?>
<!-- # -*- coding: utf-8 -*- -->
<tableau>
  <element nom="hydrogéne" numero="1" code="H"/>
  <element nom="hélium" numero="2" code="He"/>
  <element nom="lithium"  numero="3" code="Li"/>
</tableau>
que j'essaie d'analyser avec le module XML::Simple comme suit:
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
# -*- coding: utf-8 -*-
 
use strict;
use warnings;
 
use XML::Simple; # qw(:strict)
 
my $s1=<<EOF1;
<?xml version='1.0' encoding='utf-8'?>
<!-- # -*- coding: utf-8 -*- -->
<tableau>
  <element nom="hydrogéne" numero="1" code="H"/>
  <element nom="hélium" numero="2" code="He"/>
  <element nom="lithium"  numero="3" code="Li"/>
</tableau>
EOF1
 
my $elts = XMLin( $s1 , ForceArray => 1 , VarAttr => 'name', ContentKey => '-content' );
 
use Data::Dumper;
 
print Dumper($elts);
j'obtiens le résultat 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
$VAR1 = {
          'element' => [
                       {
                         'nom' => "hydrog\x{e9}ne",
                         'numero' => '1',
                         'code' => 'H'
                       },
                       {
                         'nom' => "h\x{e9}lium",
                         'numero' => '2',
                         'code' => 'He'
                       },
                       {
                         'nom' => 'lithium',
                         'numero' => '3',
                         'code' => 'Li'
                       }
                     ]
        };
J'essaie maintenant de parcourir les éléments de $elts. Ce dernier est un hash, $elts->{'element'} est un tableau, $elts->{'element'}[0] est hash et enfin $elts->{'element'}[0]{'nom'} donne hydrogène.

Pour utiliser les résultat, j'ai utilisé la boucle suivante
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
my @elt=@{$elts->{'element'}};
my $elt=@{$elts->{'element'}};
for my $i  (0.. $elt-1 ) {
  print "$elt[$i]{'nom'}\t$elt[$i]{'code'}\t$elt[$i]{'numero'}\n";
}
ce qui me donne le résultat attendu
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
hydrogène	H	1
hélium	        He      2
lithium	        Li      3
ma question est la suivante pourquoi la boucle
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
foreach ( @{$elts->{'element'}} ) {
  print "$_{'nom'}\n";
}
me donne le résultat suivant:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
Use of uninitialized value in concatenation (.) or string at ex-3.pl line 52.
 
Use of uninitialized value in concatenation (.) or string at ex-3.pl line 52.
 
Use of uninitialized value in concatenation (.) or string at ex-3.pl line 52.
et pourquoi la boucle
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
foreach my $e ( @{$elts->{'element'}} ) {
  print "$e{'nom'}\n";  #-- ligne 56
}
entraîne une erreur de syntaxe
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
Global symbol "%e" requires explicit package name at ex-3.pl line 56.
Execution of ex-3.pl aborted due to compilation errors.
merci de votre aide