Bueno, pues ya vemos qué contiene $data->{Cabecera} (cuidado con las mayúsculas, son significativas).
Queda claro que no contiene una referencia a un
array, sino los datos que necesitamos, directamente.
Lo ocurre es lo siguiente: cuando XML::Simple está leyendo el xml, se da cuenta que solo existe una <Cabecera> ... </Cabecera>, así que, en lugar de crear un
array de un solo elemento, no lo hace, y mete los valores de Cabecera directamente dentro de un
hash anónimo.
Si hubiera ocurrido más de un elemento dentro de <Cabecera>, sí que hubiera creado un
array.
Esto es lo malo de usar XML::Simple. La solución pasa por decirle a XML::Simple que siempre cree
array, aunque él crea que no son necesarios. Es una de las opciones que se le pasan a XMLin().
Ahora viene la pregunta... ¿en
todas las circunstancias, el xml a procesar siempre va a ser así (un solo dato de cabecera)? ¿O puede ocurrir que aparezca más de uno?
Si es el primer caso, nos olvidamos de toda preocupación, porque entonces no necesitas ningún bucle for(). Simplemente accedes a los datos así:
print $data->{Cabecera}->{OperadorId}, "\n";Si es el segundo caso, pues podemos poner un
Using perl Syntax Highlighting
$data = $xml->XMLin("CJT_D.xml", ForceArray => ['Cabecera']);
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
y ya está.