• Publicidad

Error: Not an ARRAY reference

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Error: Not an ARRAY reference

Notapor Redpunkpower » 2012-05-11 05:04 @253

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. foreach $e (@{$data->{Cabecera}})
  2. {
  3.         print "Operador: ", $e->{OperadorId}, "\n";
  4.         print "AlmacenId: ", $e->{AlmacenId}, "\n";
  5.         print "LoteId: ", $e->{LoteId}, "\n";
  6.         print "\n";
  7. }
  8.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Hola, buenas. Tengo este código para que me pinte en pantalla los apartados del XML pero al ejecutarlo me da el siguiente error:
Not an ARRAY reference at ordenado_texto.pl line 15.

Porque si en el código pongo esto para otro archivo .xml, sí me funciona:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. foreach $e (@{$data->{employee}})
  2. {
  3.         print $e->{name}, "\n";
  4.         print "Edad/Sexo: ", $e->{age}, "/",  $e->{sex}, "\n";
  5.         print "Departamento: ", $e->{department}, "\n";
  6.         print "\n";
  7. }
  8.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Redpunkpower
Perlero nuevo
Perlero nuevo
 
Mensajes: 35
Registrado: 2012-05-08 09:37 @442

Publicidad

Re: Error: Not an ARRAY reference

Notapor explorer » 2012-05-11 07:39 @360

El error dice que $data->{Cabecera} no contiene una referencia a un array, por lo que el forzamiento @{} no funciona.

Cuando tienes estructuras de datos complejas, acuérdate de usar Data::Dumper (o mejor, alguno de sus derivados, como Data::Dumper::Simple) para ver qué es lo que contiene.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Error: Not an ARRAY reference

Notapor Redpunkpower » 2012-05-14 06:57 @331

Sí, lo entiendo, pero ¿por qué en el primer código me da error y en el segundo no?
Redpunkpower
Perlero nuevo
Perlero nuevo
 
Mensajes: 35
Registrado: 2012-05-08 09:37 @442

Re: Error: Not an ARRAY reference

Notapor explorer » 2012-05-14 07:00 @333

Pues porque $data->{employee} sí contiene una referencia a un array...

Usa Data::Dumper... y lo ves.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Error: Not an ARRAY reference

Notapor Redpunkpower » 2012-05-16 06:33 @315

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use XML::Simple;
  2. use Data::Dumper;
  3.  
  4.  
  5. $xml = new XML::Simple (KeyAttr=>[]);
  6.  
  7.  
  8. $data = $xml->XMLin("CJT_D.xml");
  9.  
  10.  
  11. foreach $e (@{$data->{Cabecera}})
  12. {
  13.         print "Operador:", $e->{OperadorId}, "\n";
  14.         print "Almacen: ", $e->{AlmacenId}, "\n";
  15.         print "Lote: ", $e->{LoteId}, "\n";
  16.         print "\n";
  17. }
  18.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Te dejo el código entero, el use::Data ya lo tenía puesto. Por eso te digo que no sé por qué no me funciona con cabecera.
Redpunkpower
Perlero nuevo
Perlero nuevo
 
Mensajes: 35
Registrado: 2012-05-08 09:37 @442

Re: Error: Not an ARRAY reference

Notapor explorer » 2012-05-16 06:38 @318

Prueba esto y así verás el aspecto de la estructura de datos:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use XML::Simple;
  2. use Data::Dumper;
  3.  
  4. $xml = new XML::Simple (KeyAttr=>[]);
  5. $data = $xml->XMLin("CJT_D.xml");
  6.  
  7. print Dumper($data);
  8.  
  9. __END__
  10. foreach $e (@{$data->{Cabecera}})
  11. {
  12.         print "Operador:", $e->{OperadorId}, "\n";
  13.         print "Almacen: ", $e->{AlmacenId}, "\n";
  14.         print "Lote: ", $e->{LoteId}, "\n";
  15.         print "\n";
  16. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Error: Not an ARRAY reference

Notapor Redpunkpower » 2012-05-16 07:13 @342

Con eso me muestra todo el archivo XML

pero en:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. foreach $e (@{$data->{Cabecera}})
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Le estoy diciendo que me muestre los elementos de la variable $data, pero solo la cabecera.

porque si pongo:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. print Dumper($data->{Cabecera});
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

solo me pinta la cabecera
Redpunkpower
Perlero nuevo
Perlero nuevo
 
Mensajes: 35
Registrado: 2012-05-08 09:37 @442

Re: Error: Not an ARRAY reference

Notapor explorer » 2012-05-16 08:57 @414

Claro. Y viendo todo el XML, ¿qué contiene $data->{Cabecera}?

Lo que intentamos averiguar es qué contiene $data->{Cabecera}, porque según tu código, debe contener una referencia a un array, pero según el error, no.

Mucho cuidado con XML::Simple... en algunas ocasiones te creará arrays, pero en otras, no.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Error: Not an ARRAY reference

Notapor Redpunkpower » 2012-05-16 09:26 @434

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. 'Cabecera' => {
  2.               'OperadorId' => '1048',
  3.               'LoteId' => '3625',
  4.               'AlmacenId' => '10481'
  5.             },
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Eso es lo que contiene $data -> cabecera.

¿Y cómo hago para que me cree un array?
Redpunkpower
Perlero nuevo
Perlero nuevo
 
Mensajes: 35
Registrado: 2012-05-08 09:37 @442

Re: Error: Not an ARRAY reference

Notapor explorer » 2012-05-16 09:55 @455

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
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $data = $xml->XMLin("CJT_D.xml", ForceArray => ['Cabecera']);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

y ya está.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Siguiente

Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 15 invitados