2009-08-12 12 views
7

Come posso risolvere questo errore?Perché ottengo l'errore "Impossibile utilizzare la stringa come rif HASH" quando provo ad accedere a un elemento hash?

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

Errore: Impossibile utilizzare stringa ("1.249.998,666 mila") come Rif HASH mentre "strict refs" in uso presso la linea 222. /.../BMW.pm

+1

@Kys La struttura dei dati che hai postato non coerente con il codice sopra e il messaggio di errore. –

risposta

9

Chiaramente, uno dei valori in %{ $args{car_models} } non è un riferimento hash. Cioè, la struttura dei dati non contiene ciò che pensi che faccia. Pertanto, è possibile correggere la struttura dei dati o modificare il codice in modo che corrisponda alla struttura dei dati. Dato che non hai fornito la struttura dati, non posso commentare in merito.

È possibile utilizzare ref per verificare se $_ contiene un riferimento a un hash prima di provare ad accedere a un membro.

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

Sulla base del tuo commento, e dei miei poteri ESP, sto assumendo che quei valori siano timestamp. Quindi, sto indovinando, stai cercando di trovare l'anno da un valore di timestamp (numero di secondi da un'epoca). In tal caso, probabilmente si desidera localtime o gmtime:

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

Senza ulteriori, informazioni concrete su ciò che si suppone la struttura di dati per contenere, questa è la mia ipotesi migliore.

+0

Il mio intento è di inserire questi numeri nell'array @non_sorted_models come numeri in modo da poter chiamare sort sull'array. Come faccio a convertirlo in un numero intero – Kys

+0

A proposito, mettere quei controlli in posto mi ha dato gli stessi errori. – Kys

+1

@Kys Non capisco cosa stai dicendo. Stai dicendo che 'values% {$ args {car_models}}' non dovrebbe essere un riferimento all'hash? Se è così, perché li stai degnando come se dovessero esserlo? ** Mostra la tua struttura dati ** Altrimenti questo è il caso del cieco che guida il cieco. –

11

Il modulo Data::Dumper è estremamente utile in tali situazioni - per aiutarti a capire perché una struttura dati complessa non soddisfa le tue aspettative. Per esempio:

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

Hi se si dispone di una variabile hash ref (come $ hash_ref) allora codice sarà

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")); 
} 

Grazie, Manoj Shekhawat

Problemi correlati