• Publicidad

Error: Not a GLOB reference

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

Re: Error: Not a GLOB reference

Notapor explorer » 2012-05-25 09:26 @434

Pues no lo sé... pero viendo las líneas que has publicado antes, me temo que no has mostrado el archivo correcto, ya que el error dice que la línea que ha fallado es la 10, y en tu archivo, esa línea no muestra nada ejecutable.

¿Seguro que has mostrado las primeras líneas de 'U:/Perl/site/lib/XML/SAX/PurePerl/Reader/UnicodeExt.pm'?
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

Publicidad

Re: Error: Not a GLOB reference

Notapor Redpunkpower » 2012-05-28 02:47 @158

Sí, pero eso ya está arreglado. Lo borré y lo volví a instalar y lo tengo igual que el tuyo, pero el error me sigue saltando...

Pienso que el error está en esta parte.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $data = $archivo_xml->XMLin( $archivo_xml, ForceArray => ['Cabecera'] );
  2. foreach $archivo_xml ( @{ $data->{Cabecera} } ) {
  3.     if ( $operador == $archivo_xml->{OperadorId} ) {
  4.         print "Nombre correcto";
  5.     }
  6.  
  7.     else {
  8.         print "Nombre incorrecto";
  9.     }
  10. }
  11.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
Última edición por explorer el 2012-05-28 04:44 @239, editado 1 vez en total
Razón: Formateado de código con Perltidy
Redpunkpower
Perlero nuevo
Perlero nuevo
 
Mensajes: 35
Registrado: 2012-05-08 09:37 @442

Re: Error: Not a GLOB reference

Notapor explorer » 2012-05-28 04:53 @245

El código es terrible...

Estás usando $archivo_xml para tres cosas distintas: en la línea 1, dentro de XMLin(), se supone que contiene el nombre del archivo XML que vas a leer, pero al mismo tiempo vemos que almacena el objeto XML::Simple que llama a su método XMLin(). Y para rematar, en la línea 2 declaras una nueva variable $archivo_xml para recorrer los valores de @{ $data->{Cabecera} }

Entonces... cuando Perl llega a la línea 3... ¿a qué $archivo_xml nos queremos referir de los tres que has usado antes?

Por favor, da un nombre de variable distinto a cada cosa.

Otra cosa: ¿seguro que la comparación de la línea 3 es con '=='? ¿No será con 'eq'?
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 a GLOB reference

Notapor Redpunkpower » 2012-05-28 06:12 @300

en la línea 1, dentro de XMLin(), se supone que contiene el nombre del archivo XML que vas a leer, pero al mismo tiempo vemos que almacena el objeto XML::Simple que llama a su método XMLin().
No entiendo eso.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $data = $archivo_xml->XMLin($archivo_xml, ForceArray => ['Cabecera'] );
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

me crea una variable "data", quiero que coja dentro del archivo_xml y dentro del xmlin pongo que en el archivo_xml coja "cabeceras".

Son números lo que quiero que compare, por eso he puesto '=='.
Redpunkpower
Perlero nuevo
Perlero nuevo
 
Mensajes: 35
Registrado: 2012-05-08 09:37 @442

Re: Error: Not a GLOB reference

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

Redpunkpower escribiste:en la línea 1, dentro de XMLin(), se supone que contiene el nombre del archivo XML que vas a leer, pero al mismo tiempo vemos que almacena el objeto XML::Simple que llama a su método XMLin().
No entiendo eso.


A ver... en la siguiente línea:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.     my $data = $archivo_xml->XMLin($archivo_xml, ForceArray => ['Cabecera'] );
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


¿Qué contiene el $archivo_xml que está dentro de los paréntesis de XMLin()?
¿Qué contiene el $archivo_xml que está fuera de los paréntesis de XMLin()?

¿No te das cuenta de que deben ser cosas distintas, y por lo tanto, debes usar variables distintas?
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 a GLOB reference

Notapor Redpunkpower » 2012-05-28 07:01 @334

El que está fuera indica que quiero que me coja el archivo_xml que es el que contiene todo y en el de dentro quiero que de ese archivo me coja solo "cabeceras".
Redpunkpower
Perlero nuevo
Perlero nuevo
 
Mensajes: 35
Registrado: 2012-05-08 09:37 @442

Re: Error: Not a GLOB reference

Notapor explorer » 2012-05-28 07:53 @370

Bien... pero la variable es escalar... (comienza por un '$') luego solo puede contener un único valor...

Por eso, SOLO debe contener un único valor, y por lo tanto, DEBES usar dos variables distintas...

Debes hacer esto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $archivo_xml = 'el_archivo_xml_que_quiero_procesar.xml';   # nombre del archivo
  2. my $xml_simple  = XML::Simple->new();                         # creamos un objeto XML::Simple
  3. my $data        = $xml_simple->XMLin($archivo_xml, ForceArray => ['Cabecera'] );   # leemos (¡fíjate en las variables!)
  4.  
  5. for my $cabecera ( @{ $data->{Cabecera} } ) {                 # para todos los datos de la Cabecera
  6.     if ($operador == $cabecera->{OperadorId} ) {              # extraemos su OperadorId
  7.         print "...";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Por favor, observa que usamos una variable DISTINTA por cada información DISTINTA que vamos leyendo. Son cuatro variables, porque guardan cuatro valores distintos.

Otra forma, más simplificada (por poner 'use XML::Simple' al principio):
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $archivo_xml = 'el_archivo_xml_que_quiero_procesar.xml';
  2. my $data        = XMLin($archivo_xml, ForceArray => ['Cabecera'] );
  3.  
  4. for my $cabecera ( @{ $data->{Cabecera} } ) {                 # para todos los datos de la Cabecera
  5.     if ($operador == $cabecera->{OperadorId} ) {              # extraemos su OperadorId
  6.         print "...";
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 a GLOB reference

Notapor Redpunkpower » 2012-05-28 10:41 @487

He usado la primera opción y va perfecto muchas gracias.

Si en la condición quiero que me compruebe que está en blanco, ¿cómo lo pongo?

he probado con
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. if ( $cabecera->{OperadorId} eq " " ) {
  2.     print "El nombre está incompleto";
  3.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

pero no me sale lo que yo quiero.
Redpunkpower
Perlero nuevo
Perlero nuevo
 
Mensajes: 35
Registrado: 2012-05-08 09:37 @442

Re: Error: Not a GLOB reference

Notapor explorer » 2012-05-28 11:49 @534

No queda muy claro lo que quieres decir con "en blanco". ¿Te refieres a que no tenga ninguna información o que la única información que tenga sea uno o más caracteres espacio en blanco.

Para el primer caso
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. if (not $cabecera->{OperadorId}) {
  2.     print "El nombre está incompleto";
  3. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

aunque yo pondría más controles, como por ejemplo, la definición y la existencia:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. if (exists($cabecera->{OperadorId}) and defined($cabecera->{OperadorId}) and $cabecera->{OperadorId}) {
  2.     print "El nombre es $cabecera->{OperadorId}\n";
  3. }
  4. else {
  5.     print "El nombre está incompleto\n";
  6. }
  7.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
bueno, queda más corto así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. if (exists($cabecera->{OperadorId}) and $cabecera->{OperadorId}) {
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Ahora bien... si alguna vez $cabecera->{OperadorId} pudiera valer 0 o '0', entonces hay que hacerlo así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. if (defined $cabecera->{OperadorId}) {
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Más información en perldoc -f exists y perldoc -f defined .
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 a GLOB reference

Notapor Eowyn » 2013-07-10 04:56 @247

A mí también me aparece este error pero no exactamente así. Leo "Not a GLOB reference at Main line 106"

Siendo el código este:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. print("Sar ezazu kargatu nahi duzun fitxategiaren izena: ");
  2. my $fitxategia = <STDIN>;
  3. chomp $fitxategia;
  4. -f $fitxategia or die "Errorea, ezin da $fitxategia aurkitu";
  5. open( my $FITX, $fitxategia );
  6. Hash_Taula_Kargatu($fitxategia);
  7.  
  8. sub Hash_Taula_Kargatu {
  9.  
  10.     my @term_arraya1;                  #arraya hutsa definitu
  11.     my @term_arraya2;
  12.     my $fitxategia       = shift;
  13.     my %Moten_Hash_Taula = (
  14.         "N.IZE-ARR" => \@term_arraya1,
  15.         "G.ADJ-ARR" => \@term_arraya2);
  16.     my $FITX = XML::XPath->new( filename => $fitxategia );
  17.  
  18.     my $nodeset = $FITX->find('/KAF/terms/term');    
  19.     my $gakoa;
  20.  
  21.     foreach my $node ( $nodeset->get_nodelist ) {
  22.         my $term = XML::XPath::XMLParser::as_string($node);
  23.  
  24.         ($gakoa) = $term =~ /pos="(.*?)"/;
  25.         push( @{ $Moten_Hash_Taula{"$gakoa"} }, $term );
  26.  
  27.     }
  28.     while ( my $lerroADI = <$FITX> ) { # aquí parece que da el error
  29.         chomp $lerroADI;
  30.  
  31.         for my $ADIa (@array) {
  32.             if ( $lerroADI eq $ADIa ) {
  33.                 $ADI = 1;
  34.                 last;
  35.             }
  36.         }
  37.     }
  38.  
  39.     if ( $ADI == 1 ) {
  40.         print "Encontrado";
  41.     }
  42.  
  43.     #close $ARCHIVO;
  44. }
  45.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
Última edición por Eowyn el 2013-07-10 10:49 @492, editado 1 vez en total
Eowyn
Perlero nuevo
Perlero nuevo
 
Mensajes: 45
Registrado: 2011-06-04 08:51 @410

AnteriorSiguiente

Volver a Básico

¿Quién está conectado?

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

cron