2009-08-12 7 views
7

¿Cómo puedo solucionar este error?¿Por qué aparece el error "No se puede utilizar la cadena como referencia HASH" cuando intento acceder a un elemento hash?

foreach (values %{$args{car_models}}) { 
    push(@not_sorted_models, UnixDate($_->{'year'},"%o")); 
} 

Error: No se puede utilizar cadena ("1249998666") como un ref HASH mientras que los "estrictos árbitros" en uso en la línea 222. /.../BMW.pm

+1

@Kys La estructura de datos informados es no es coherente con el código anterior y el mensaje de error. –

Respuesta

9

Claramente, una de los valores en %{ $args{car_models} } no es una referencia hash. Es decir, la estructura de datos no contiene lo que crees que es. Por lo tanto, puede corregir la estructura de datos o cambiar su código para que coincida con la estructura de datos. Como no ha proporcionado la estructura de datos, no puedo comentar sobre eso.

Puede usar ref para ver si $_ contiene una referencia a un hash antes de intentar acceder a un miembro.

if (ref eq 'HASH' and exists $_->{year}) { 
    push(@not_sorted_models, UnixDate($_->{year},"%o")); 
} 

Según su comentario, y mis poderes ESP, estoy asumiendo que esos valores son marcas de tiempo. Entonces, supongo que está tratando de encontrar el año a partir de un valor de marca de tiempo (número de segundos de una época). En ese caso, es probable que desee localtime o gmtime:

my $year = 1900 + (localtime)[5]; 
 
C:\Temp> perl -e "print 1900 + (localtime(1249998666))[5]" 
2009 

Sin más, información concreta sobre lo que se supone que la estructura de datos que contiene, este es mi mejor conjetura.

+0

Mi intención es insertar estos números en la matriz @non_sorted_models como números para que pueda llamar a ordenar en la matriz. ¿Cómo puedo convertirlo en un número entero? – Kys

+0

Por cierto, poner esos controles en su lugar aún me da los mismos errores. – Kys

+1

@Kys No entiendo lo que dices. ¿Estás diciendo que 'values% {$ args {car_models}}' no se supone que sean referencias hash? Si ese es el caso, ¿por qué los desreferencia como si supuestamente lo fueran? ** Muestre su estructura de datos ** De lo contrario, este es un caso de ciegos guiando a los ciegos. –

11

El módulo Data::Dumper es extremadamente útil en tales situaciones, para ayudarle a descubrir por qué una estructura de datos compleja no cumple con sus expectativas. Por ejemplo:

use Data::Dumper; 
print Dumper(\%args); 
0

Hola si tiene una variable hash de referencia (como $ hash_ref) a continuación código será

if (ref($hash_ref) eq 'HASH' and exists $hash_ref->{year}) { 
    push(@not_sorted_models, UnixDate($hash_ref->{year},"%o")); 
} 
#instead of below: 
if (ref eq 'HASH' and exists $_->{year}) { 
    push(@not_sorted_models, UnixDate($_->{year},"%o")); 
} 

Gracias, Manoj Shekhawat

Cuestiones relacionadas